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