10

我有一个这样的 SQL 查询字符串:

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

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

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

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

4

3 回答 3

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;

我认为@name参数实际上是从其他地方填充的,如果使用适当的参数化,您不必处理转义'.

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

于 2013-08-20T21:19:14.520 回答
5

我认为应该这样做:

 DECLARE @sql varchar(max)
SET @sql = ' INSERT INTO ' + @tempTable1 + 
       ' SELECT 0 as Type1, 0 as Type2, ' + ''''+
         replace( @name ,'''','''''')+''''+' as CompanyName  
       FROM #tempTable2 tt2'
于 2013-08-20T21:02:33.057 回答
1

您可以使用sp_executesql系统过程。sp_executesql 将允许您使用 @name 参数调用动态 SQL,而不是将其嵌入到 SQL 中。

DECLARE @sql nvarchar(max),
        @name varchar(50)
SET @name = 'qwe'''           
SET @sql = 'INSERT INTO ' + @tempTable1 +
           ' SELECT 0 as Type1, 0 as Type2, ' + 
           '@name as CompanyName ' + 
           'FROM #tempTable2 tt2'
--PRINT @sql
EXEC sp_executesql @sql, N'@name varchar(50)', @name
于 2013-08-20T21:20:04.723 回答