Dynamic SQL Server stored procedure with table name as input param -
मेरे पास निम्न संग्रहीत कार्यप्रणाली है
CREATE PROCEDURE [dbo]। [Insert] @ सेवा varchar (max), @TableName varchar (100), @query varchar (250), varchar (max), @CreatedDate datetime, @ExpirationDate दिनांक के रूप में शुरुआत सेट NOCOUNT पर @Results; लेन-देन शुरू घोषणा @SQL NVARCHAR (मैक्स), @ParmDefinition NVARCHAR (मैक्स) घोषित @ q1 VARCHAR (मैक्स), @ rez1 VARCHAR (मैक्स), @ DATE1 DATETIME, @ DATE2 DATETIME घोषित @tablename VARCHAR (मैक्स) = @Service + ' । ' + @TableName सेट @SQL = N'if नहीं मौजूद है ( '+ @tablename +' से @q का चयन करें जहां क्वेरी = @q) '+ @tablename +' मूल्यों में डालने (@q, @rez, @ DATE1, @ DATE2 ) 'सेट @ParmDefinition = एन' @ क्ष varchar (max), @rez varchar (max), @ DATE1 datetime, @ DATE2 datetime 'निष्पादित sp_executesql - गतिशील T-SQL @SQL, @ParmDefinition, @q = @query, @rez = @Results, @ DATE1 = @CreatedDate, @ DATE2 = @ExpirationDate COMMIT TRANSACTION अंत जब मैं इसे निष्पादित करने के लिए प्रयास करते हैं, यह कुछ भी सम्मिलित नहीं है 0 पंक्तियों
अगर मैं संग्रहीत कार्यविधि के बिना कोड निष्पादित करता हूं, जैसे कि एक एकल क्वेरी यह सम्मिलित करता है
क्या मुझे कुछ याद आ रही है?
आपके द्वारा अपने प्रश्न में जो बहुत कुछ किया है, जो मेरे लिए कोई मतलब नहीं है, आपको इन प्रक्रियाओं के अंदर इन सभी चर को घोषित करने की आवश्यकता क्यों है?
हां सही आप एसक्यूएल इंजेक्शन हमले के खिलाफ खुद को बचाने के लिए parametrised क्वेरी का उपयोग कर रहे हैं, फिर भी आप ऑब्जेक्ट नामों (तालिका और डेटाबेस नाम) को जोड़कर एक छेद छोड़ दिया है, हाँ आपको उन्हें जोड़ना होगा, लेकिन आप उपयोग कर सकते हैं QUOTENAME () फ़ंक्शन के आसपास उनके पैरामीटर पारित किए गए हैं और एसक्यूएल सर्वर को लागू करने के लिए इन पैरामीटर के चारों ओर चौकोर ब्रैकेट लगाते हैं और एसक्यूएल सर्वर को बल देते हैं, लेकिन उन्हें ऑब्जेक्ट के नाम पर कुछ भी नहीं माना जाता है। अगर मौजूदा में चर ज्यादा मायने नहीं रखता है तो 1 का चयन करें जो सही मानता है यदि मिलान मानदंडों के साथ एक पंक्ति मिलती है, और यदि कोई पंक्ति नहीं मिली है तो यह केवल एक पंक्ति सम्मिलित करेगा केवल घोषित करने की आवश्यकता वाले वेरिएबल्स घोषित करें, अन्यथा यह गड़बड़ की तरह दिखता है और डीबग करना मुश्किल होता है। जैसा कि वे कहते हैं इसे सरल रखें :) अपने मानदंडों के लिए उपयुक्त डेटा प्रकारों का भी उपयोग करें, @ सेवा मेरा मानना है कि आपका डेटाबेस नाम क्यों इसकी आवश्यकता है एक VARCHAR (अधिकतम) डेटा प्रकार के लिए, एसक्यूएल सर्वर ऑब्जेक्ट नाम SYSNAME को स्टोर करने के लिए विशिष्ट डेटा प्रकार का उपयोग करें। बनाएं प्रक्रिया [dbo]। [डालें] @Service SYSNAME, @TableName SYSNAME, @query varchar (250), @Results varchar (max), @CreatedDate datetime, @ExpirationDate दिनांक के रूप में शुरुआत सेट नाकनेट चालू; लेन-देन में घोषणा @SQL NVARCHAR (मैक्स), @ParmDefinition NVARCHAR (मैक्स) सेट @SQL = N'IF मौजूद नहीं है ( '+ QUOTENAME (@Service) +' से 1 का चयन शुरू करते हैं। '+ QUOTENAME (@TableName) + एन' जहां Query = @q) '+' एन 'एनर्ट करें' + QUOTENAME (@ सेवा) + '।' + QUOTENAME (@TableName) + एन 'मान (@q, @rez, @ DATE1, @ DATE2)' सेट @ParmDefinition = एन '@ क्ष varchar (250), @rez varchar (max), @ DATE1 datetime, @ DATE2 datetime 'निष्पादित sp_executesql @SQL, @ ParmDefinition, @ q = @query, @ rez = @Results, @ DATE1 = @CreatedDate, @ DATE2 = @ExpirationDate लेनदेन अंत COMMIT
Comments
Post a Comment