5

我尝试选择一些包含特殊字符的特殊记录,但 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命令返回空值。

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

SQL_Latin1_General_CP1_CI_AS

它适用于一些特殊的字符串,但它也不支持我的所有字符串。所以,问题来了:我怎样才能告诉 SQL Server,请不要更改我的字符串 ascii 代码?有没有办法(或任何排序规则)说 SQL Server 看到的字符串与现实中的字符串完全一样?

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

4

2 回答 2

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;
于 2013-04-07T11:45:20.543 回答
2

如果您有需要保留的特殊字符,请使用Unicode字符串类型NVARCHAR而不是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它允许您为查询定义和提供参数。

于 2013-04-07T11:49:35.967 回答