当变量包含单引号时,SQL动态查询字符串中断

Ela*_*e K 10 sql sql-server-2005

我有一个SQL查询字符串,如下所示:

DECLARE @sql varchar(max)
SET @sql = ' INSERT INTO ' + @tempTable1 + 
           ' SELECT 0 as Type1, 0 as Type2, ' + 
             '''' + @name + ''' as CompanyName ' + 
           ' FROM #tempTable2 tt2'
Run Code Online (Sandbox Code Playgroud)

查询运行正常,除了恰好包含单引号的两个名称(例如:Pete's Corner).当这些名称中的任何一个成为查询的一部分时,它会破坏查询字符串.我认为最简单的方法是替换单引号,如替换(@name,'''',''),但它不起作用,因为我已经在一个字符串中,所以它影响其余的该声明.不幸的是,改变表本身并不是一种选择.

如何更换或删除这些单引号?

另外:我道歉,我没有包含@name实际上是通过连接从另一个数据库表填充的部分,因此在创建字符串之前设置@name的值我认为对我来说很难.

Aar*_*and 6

为什么你需要这样做呢?您应该传递强参数,sp_executesql而不是将所有参数复制到单个字符串中并使用EXEC().关于这里的更多信息.

DECLARE @sql NVARCHAR(MAX), @name NVARCHAR(32);

SET @name = 'Pete''s Corner';

SET @sql = 'INSERT INTO ' + @tempTable1 +
  ' SELECT 0 as Type1, 0 as Type2, @name as CompanyName ' + 
  ' FROM #tempTable2 tt2';

EXEC sp_executesql @sql, N'@name NVARCHAR(32)', @name;
Run Code Online (Sandbox Code Playgroud)

我假设@name参数实际上从其他地方填充,如果使用正确的参数化,你不应该处理转义'.

现在我不太确定@tempTable1应该代表什么,或者你是否可以#tempTable2从这个范围访问,但每当你发现自己运行需要''''''''''(或两者)的替换时,你应该问自己是否有更好的方法.


jym*_*mbo 5

我认为应该这样做:

 DECLARE @sql varchar(max)
SET @sql = ' INSERT INTO ' + @tempTable1 + 
       ' SELECT 0 as Type1, 0 as Type2, ' + ''''+
         replace( @name ,'''','''''')+''''+' as CompanyName  
       FROM #tempTable2 tt2'
Run Code Online (Sandbox Code Playgroud)