2013-04-07 8 views
5

चलाने से पहले अपने तारों को बदल दिया है, मैं कुछ विशेष रिकॉर्डों को चुनने का प्रयास करता हूं, विशेष वर्ण होते हैं लेकिन SQL सर्वर क्वेरी चलाने से पहले मेरे स्ट्रिंग वर्ण बदलता है।एसक्यूएल सर्वर ने क्वेरी

उदाहरण के लिए:

DECLARE @param NVARCHAR(30) 

    SET @param=N'¤÷þ'--this is my special string that i want to be searched exactly. 

    DECLARE @TSQL varchar(8000) 
    SET @TSQL = 'SELECT * FROM MyTable WHERE MyFieldName LIKE %' + @param + '% ' 

    PRINT @TSQL 

    --EXECUTE (@TSQL) 

लेकिन परिणाम में (प्रिंट) मैं देख रहा हूँ: (?)

SELECT * FROM MyTable WHERE MyFieldName LIKE '%¤÷þ?%' 

आप के लिए चरित्र परिवर्तित स्ट्रिंग के कुछ हिस्से को देखने के रूप में, इस समस्या को मेरी SELECT कारण आदेश वापसी शून्य मूल्य।

मैं डेटाबेस है कि मैं करने के लिए क्वेरी चलाने का मिलान को बदलने की कोशिश:

SQL_Latin1_General_CP1_CI_AS 

यह कुछ विशेष तार के साथ अच्छा काम लेकिन यह भी मेरी तार के सभी का समर्थन नहीं करता। तो, प्रश्न यहां है: मैं SQL सर्वर कैसे बता सकता हूं, कृपया मेरी स्ट्रिंग एएससीआई कोड न बदलें? क्या एसक्यूएल सर्वर कहने का कोई तरीका है (या कोई भी collation) जो एक स्ट्रिंग को वास्तव में वास्तविकता में देखता है?

पीएस: मैं SQL सर्वर 2008 आर 2 का उपयोग कर रहा हूं।

+0

'माईफिल्ल्डनाम' का किस प्रकार का है? डीबी संयोजन को बदलना मौजूदा कॉलम के लिए कुछ नहीं करता है, fyi। – usr

+2

वैसे आप क्या उम्मीद करते हैं, '@ टीएसक्यूएल'' वर्चर (8000) 'है? –

+0

ओएमजी! मेरे कोड का केवल एक हिस्सा कॉपी किया गया है (मैं इसके बारे में कभी नहीं सोचता)। दोस्त धन्यवाद। – Jupiter

उत्तर

2

आपको विशेष वर्ण संरक्षित किये जाने की आवश्यकता है, तो इसके बजाय के प्रकार NVARCHARVARCHAR की यूनिकोड तार का उपयोग करें - यह इतना आसान .....

DECLARE @param NVARCHAR(30) 
SET @param = N'¤÷þ'--this is my special string that i want to be searched exactly. 

DECLARE @TSQL NVARCHAR(4000) -- <=== use NVARCHAR here 
SET @TSQL = N'SELECT * FROM MyTable WHERE MyFieldName LIKE %' + @param + N'% ' 

PRINT @TSQL 

तो है आपके विशेष पात्र को संरक्षित किया जाएगा ...

और जैसा कि अन्य ने इंगित किया है: आपके एस को एक साथ जोड़ना इस तरह के क्यूएल स्टेटमेंट्स कभी भी एक अच्छा विचार नहीं है - यह आपके कोड को संभावित एसक्यूएल इंजेक्शन हमलों में खुलता है। आपको पैरामीटरयुक्त प्रश्नों और sp_executesql का उपयोग करना चाहिए जो आपको अपने प्रश्नों के लिए पैरामीटर को परिभाषित और आपूर्ति करने की अनुमति देता है।

+1

सरल उत्तर और सुरक्षा युक्तियों के लिए भी धन्यवाद। (यह केवल मेरे उद्देश्य का परीक्षण उद्देश्य के लिए है, इसलिए मैं पैरामीट्रिक चर के साथ अंतिम रिलीज में कमांड बदल दूंगा।) – Jupiter

2
DECLARE @TSQL varchar(8000) 

varchar(8000)¤÷þ का प्रतिनिधित्व नहीं कर सकते हैं। बस @param के साथ आप क्या कर रहे हैं; NVARCHAR आधारित कुछ का उपयोग करें।

usr सही ढंग से इंगित करता है, आपको वास्तव में sp_executesql और पैरामीटर निर्दिष्ट करने की क्षमता का उपयोग करना चाहिए। प्रलेखन से:

DECLARE @IntVariable int; 
DECLARE @SQLString nvarchar(500); 
DECLARE @ParmDefinition nvarchar(500); 

/* Build the SQL string one time.*/ 
SET @SQLString = 
    N'SELECT BusinessEntityID, NationalIDNumber, JobTitle, LoginID 
     FROM AdventureWorks2012.HumanResources.Employee 
     WHERE BusinessEntityID = @BusinessEntityID'; 
SET @ParmDefinition = N'@BusinessEntityID tinyint'; 
/* Execute the string with the first parameter value. */ 
SET @IntVariable = 197; 
EXECUTE sp_executesql @SQLString, @ParmDefinition, 
         @BusinessEntityID = @IntVariable; 
+2

इसके अलावा, एसक्यूएल concatenation चीज मत करो। 'Sp_executesql' के साथ पैरामीटर का प्रयोग करें। – usr

संबंधित मुद्दे