T-SQL Update Query语法错误

时间:2016-10-24 10:32:23

标签: sql sql-server tsql

我有这个简单的查询: -

update [Schema1].ReportData 
set Qry = 'declare @cols nvarchar(max) select @cols = ''Code,Name,DateOfJoining''' 
where ViewName = 'Rpt1'

但这是问题所在。我有50多个模式,所以我做了以下 (总结SQL):

WHILE (@i <= (SELECT MAX(idx) FROM @schema_table))
    BEGIN

        -- get the next record primary key
        SET @schema_names = (SELECT schema_names FROM @schema_table WHERE idx = @i)

        BEGIN TRY
            DECLARE @sSQL nvarchar(500);            
            SELECT @sSQL = N'update '+@schema_names+'.ReportData set Qry='declare @cols nvarchar(max) select @cols = ''Code,FName,DateOfJoining ,CategoryName''' where  ViewName='Rpt1''
            EXEC sp_executesql @sSQL
        END TRY
        BEGIN CATCH
            SELECT ERROR_MESSAGE()+' '+@schema_names AS ErrorMessage;
        END CATCH

        -- increment counter for next record
        SET @i = @i + 1
    END

但是在这一行给我语法错误: -

SELECT @sSQL = N'update '+@schema_names+'.ReportData set Qry='declare @cols nvarchar(max) select @cols = ''Code,FName,DateOfJoining ,CategoryName''' where  ViewName='Rpt1''

实际上我尝试过很多东西,比如使用双引号和&amp;转义字符。 怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

希望我理解你的UPDATE声明:

SELECT @sSQL = N'update '+QUOTENAME(@schema_names)+'.ReportData 
set Qry=''declare @cols nvarchar(max) select @cols = ''''Code,FName,DateOfJoining ,CategoryName''''''
where  ViewName=''Rpt1'''

如果您正在使用任何数据库对象,最好使用QUOTENAME

  

返回一个Unicode字符串,其中添加了分隔符,以使输入字符串成为有效的SQL Server分隔标识符。

将为您执行此查询:

update [Schema1].ReportData 
set Qry='declare @cols nvarchar(max) select @cols = ''Code,FName,DateOfJoining ,CategoryName'''
where  ViewName='Rpt1'

因此,在运行此批处理后,Qry将等于:

declare @cols nvarchar(max) select @cols = 'Code,FName,DateOfJoining ,CategoryName'

修改

另一种方法是使用CHAR(39)(单引号):

SELECT @sSQL = N'update '+QUOTENAME(@schema_names)+'.ReportData 
set Qry= '+CHAR(39) +'declare @cols nvarchar(max) select @cols = '+CHAR(39)+ CHAR(39)+'Code,FName,DateOfJoining ,CategoryName'+ CHAR(39) +CHAR(39) + CHAR(39) + '
where  ViewName='+ CHAR(39)+'Rpt1'+ CHAR(39)