SQL Server 在运行查询之前更改了我的字符串
Posted
技术标签:
【中文标题】SQL Server 在运行查询之前更改了我的字符串【英文标题】:SQL Server changed my strings before running the query 【发布时间】:2013-03-29 12:26:46 【问题描述】:我尝试选择一些包含特殊字符的特殊记录,但 字符。
例如:
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。
【问题讨论】:
MyFieldName
有什么类型?更改数据库排序规则对现有列没有任何作用,仅供参考。
好吧,@TSQL
是 varchar(8000)
?
天哪!只有我的部分代码被复制(我从没想过)。谢谢老兄。
【参考方案1】:
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;
【讨论】:
另外,不要做 SQL 连接的事情。使用带有sp_executesql
的参数。【参考方案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
,它允许您为查询定义和提供参数。
【讨论】:
感谢您的简单回答以及安全提示。 (这是我的代码的一部分,仅用于测试目的,所以我将在上一个版本中使用参数变量更改命令。)以上是关于SQL Server 在运行查询之前更改了我的字符串的主要内容,如果未能解决你的问题,请参考以下文章