我尝试选择一些包含特殊字符的特殊记录,但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。
答案 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
,它允许您为查询定义和提供参数。