2010-09-29 6 views
5

उल्लेख संग्रहीत प्रक्रिया नीचे त्रुटि दे रहा है?संग्रहित प्रक्रिया वाक्य रचना त्रुटि (MSSQL)

CREATE PROCEDURE crosstab 
@select varchar(8000), 
@sumfunc varchar(100), 
@pivot varchar(100), 
@table varchar(100) 
AS 

DECLARE @sql varchar(8000), @delim varchar(1) 
SET NOCOUNT ON 
SET ANSI_WARNINGS OFF 

EXEC ('SELECT ' + @pivot + ' AS pivot INTO ##pivot FROM ' + @table + ' WHERE 1=2') 
EXEC ('INSERT INTO ##pivot SELECT DISTINCT ' + @pivot + ' FROM ' + @table + ' WHERE ' 
+ @pivot + ' Is Not Null') 

SELECT @sql='', @sumfunc=stuff(@sumfunc, len(@sumfunc), 1, ' END)') 

SELECT @delim=CASE Sign(CharIndex('char', data_type)+CharIndex('date', data_type)) 
WHEN 0 THEN '' ELSE '''' END 
FROM tempdb.information_schema.columns 
WHERE table_name='##pivot' AND column_name='pivot' 

SELECT @[email protected] + '''' + convert(varchar(100), pivot) + ''' = ' + 
stuff(@sumfunc,charindex('(', @sumfunc)+1, 0, ' CASE ' + @pivot + ' WHEN ' 
+ @delim + convert(varchar(100), pivot) + @delim + ' THEN ') + ', ' FROM ##pivot 

DROP TABLE ##pivot 

SELECT @sql=left(@sql, len(@sql)-1) 
SELECT @select=stuff(@select, charindex(' FROM ', @select)+1, 0, ', ' + @sql + ' ') 

EXEC (@select) 
SET ANSI_WARNINGS ON 

उत्तर

6

यह एक प्रक्रिया मूल रूप से एसक्यूएल सर्वर ने 2000 pivot एक कीवर्ड नहीं था के लिए इस्तेमाल की तरह दिखता है:

नीचे स्क्रिप्ट है। इसके बजाय [pivot] का उपयोग करने के लिए नीचे अनुभाग को बदलें।

SELECT @[email protected] + '''' + convert(varchar(100), [pivot]) + ''' = ' + 
stuff(@sumfunc,charindex('(', @sumfunc)+1, 0, ' CASE ' + @pivot + ' WHEN ' 
+ @delim + convert(varchar(100), [pivot]) + @delim + ' THEN ') + ', ' FROM ##pivot 

आप शायद भी @table पैरामीटर के लिए sysname डेटा प्रकार का उपयोग करना चाहिए, जब मेज और स्तंभ नाम श्रृंखलाबद्ध quotename समारोह का उपयोग करें और varchar से nvarchar बल्कि का उपयोग करें।

ये सभी सुझाव हैं जो एसक्यूएल इंजेक्शन संभावनाओं को कम करने के साथ-साथ आपको गैर मानक ऑब्जेक्ट नामों से निपटने की इजाजत देते हैं। वर्तमान में sysnamenvarchar(128) है। के बजाय sysname का उपयोग करके हालांकि भविष्य में संस्करण में यह परिवर्तन होने पर आपको प्रक्रिया को अपडेट नहीं करना होगा।

varchar(100) का उपयोग करना मतलब है कि आपकी प्रक्रिया 100 वर्णों से अधिक ऑब्जेक्ट नामों को नियंत्रित करने में सक्षम नहीं होगी। साथ ही गैर मानक वर्ण वाले मान्य नामों को संभालने में सक्षम नहीं है।

निम्नलिखित is allowed in SQL Server

CREATE TABLE "╚╦╩╗" ("└┬┴┐" nvarchar(10)) 

यहां तक ​​कि अगर आप केवल अपने टेबल और यूनिकोड ऐसे ʼ चरित्र के रूप में समस्याओं को रोकने के रूप में अपने मापदंडों और चर रखने ASCII वर्ण का उपयोग कर स्तंभों नाम (U + 02BC) चुपचाप करने के लिए परिवर्तित किया जा रहा एक नियमित apostrophe।

quotename सुनिश्चित होगा कि आप किसी भी स्तंभ Robert'); DROP TABLE Students; कहा जाता है कि इन [Robert'); DROP TABLE Students;] के रूप में सही ढंग से भाग निकले कर रहे हैं वस्तु नाम पर कोई भी एम्बेडेड वर्ग कोष्ठक के साथ काम कर के रूप में भी है।

+0

बहुत कुछ। क्या आप sysname और quotename से मतलब है ?? – Thakur

+0

@Aamod - संपादित करें देखें। –

3

Pivot एक SQL कीवर्ड है। तो आपको स्क्वायर ब्रैकेट के भीतर इसे संलग्न करने की आवश्यकता है।