2013-04-07 4 views
5

Ich versuche einige spezielle Datensätze auszuwählen, die Sonderzeichen enthalten, aber SQL Server ändert meine Zeichenfolgen, bevor die Abfrage ausgeführt wird.SQL Server hat meine Zeichenfolgen geändert, bevor die Abfrage ausgeführt wurde

Zum Beispiel:

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) 

Aber im Ergebnis (Druck) Ich sehe: (?)

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

Wie Sie einen Teil-String sehen umgewandelt Charakter, dieses Problem mein SELECT verursachen Befehl gibt Nullwert zurück.

Ich versuche Sortierung der Datenbank zu ändern, die ich die Abfrage auszuführen:

SQL_Latin1_General_CP1_CI_AS 

Es mit einigen speziellen Zeichenfolge gut funktionieren, aber es ist auch nicht alle meine Saiten unterstützen. Also, Frage ist hier: Wie kann ich SQL Server sagen, bitte ändern Sie nicht meine ASCII-Codes? Gibt es eine Möglichkeit (oder eine Sortierung), SQL Server zu sagen, die eine Zeichenfolge genau so sehen, wie sie in Wirklichkeit ist?

PS: Ich verwende SQL Server 2008 R2.

+0

Welchen Typ hat 'MyFieldName'? Das Ändern der DB-Sortierung führt zu keinen vorhandenen Spalten, fyi. – usr

+2

Nun, was erwartest du, '@ TSQL' ist' varchar (8000) '? –

+0

OMG! Nur ein Teil meines Codes, der kopiert wird (darüber denke ich nie nach). Danke, Alter. – Jupiter

Antwort

2

Wenn Sie Sonderzeichen, die bewahrt werden müssen Unicode Strings vom Typ verwenden NVARCHAR statt VARCHAR - Dann ist es so einfach .....

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 

Ihre Sonderzeichen werden erhalten wie eingegeben ....

Und wie andere haben darauf hingewiesen: Verketten Sie zusammen Ihre S QL-Anweisungen wie diese sind nie eine gute Idee - sie öffnen Ihren Code für mögliche SQL-Injection-Angriffe. Sie sollten parametrisierte Abfragen und sp_executesql verwenden, mit denen Sie Parameter für Ihre Abfragen definieren und bereitstellen können.

+1

Danke für die einfache Antwort und auch für Sicherheitstipps. (Dies ist ein Teil meines Codes nur für Testzwecke, also werde ich den Befehl in der letzten Version mit parametrischen Variablen ändern.) – Jupiter

2
DECLARE @TSQL varchar(8000) 

varchar(8000) kann ¤÷þ nicht vertreten. Mach weiter, was du tust mit @param; Verwenden Sie etwas NVARCHAR basiert.

Wie usr richtig hervorhebt, sollten Sie wirklich sp_executesql und seine Fähigkeit verwenden, Parameter zu spezifizieren. Aus der Dokumentation:

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

Auch nicht die SQL-Verkettung Sache. Verwenden Sie einen Parameter mit 'sp_executesql'. – usr