SQL Server在运行查询之前更改了我的字符串

时间:2013-04-07 11:32:57

标签: sql-server sql-server-2008-r2 collation

我尝试选择一些包含特殊字符的特殊记录,但SQL Server在运行查询之前更改了我的字符串字符。

例如:

    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命令返回null值。

我尝试将运行查询的数据库的排序规则更改为:

SQL_Latin1_General_CP1_CI_AS

它可以正常使用一些特殊的字符串,但它也不支持我的所有字符串。 所以,问题在这里:我怎么能告诉SQL Server,请不要更改我的字符串ascii代码? 是否有任何方式(或任何整理)说SQL Server完全按照现实的方式查看字符串?

PS:我使用的是SQL Server 2008 R2。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

如果您需要保留特殊字符,请使用类型为NVARCHAR Unicode 字符串,而不是VARCHAR - 就这么简单......

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

然后您输入的特殊字符将保留 ....

正如其他人已经指出的那样:将这样的SQL语句连接在一起从来都不是一个好主意 - 它会为潜在的SQL注入攻击打开你的代码。您应该使用参数化查询和sp_executesql,它允许您为查询定义和提供参数。