我有一个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)。当这些名称中的任何一个成为查询的一部分时,它会破坏查询字符串。我认为最简单的方法是替换单引号,如替换(@name,'''',''),但它不起作用,因为我已经在一个字符串中,所以它影响其余的该声明。不幸的是,改变表本身并不是一种选择。
如何更换或删除这些单引号?
另外:我道歉,我没有包含@name实际上是通过连接从另一个数据库表填充的部分,因此在创建字符串之前设置@name的值我认为对我来说很难。
答案 0 :(得分:6)
为什么你需要这样做?您应该将强参数传递给sp_executesql
,而不是将所有参数整合到一个字符串中并使用EXEC()
。 More info on that here
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
,但每当您发现自己正在运行需要''''
的替换时或''''''
(或两者),你应该问自己是否有更好的方法。
答案 1 :(得分:5)
我认为应该这样做:
DECLARE @sql varchar(max)
SET @sql = ' INSERT INTO ' + @tempTable1 +
' SELECT 0 as Type1, 0 as Type2, ' + ''''+
replace( @name ,'''','''''')+''''+' as CompanyName
FROM #tempTable2 tt2'
答案 2 :(得分: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