如何使用动态 table 名称更新 table?

How to update table with dynamic table name?

我想更新动态生成的 table 列。

我试过了

ALTER PROCEDURE [dbo].[spname]
     @Id INT ,
     @Flag varchar(MAX),
     @TableName nvarchar(max) ,  
AS  
BEGIN    
    IF(@Flag='Process')  
    BEGIN   
    DECLARE @squery nvarchar(max) = ''

    IF EXISTS(SELECT NAME FROM [DZ_REPO].SYS.TABLES WHERE NAME = @TABLENAME)
        BEGIN
            set @squery = 'use [DZ_REPO]'
            set @squery += 'UPDATE A SET A.cFirstName=B.FN, A.cLastName=B.LN, A.cAddress=B.ADDR, A.cCity=B.CITY, A.cState=B.ST, A.cZIP=B.ZIP, 
            A.cGender=B.GENDER, A.cAge=B.EXACT_AGE, A.cHouseholdIncomeCode=B.HH_INCOME FROM [dbo].['+@TableName+'] as A, [Consumer].[dbo].[CONSUMERDB] as B 
            WHERE A.Email=B.Email AND A.AccountId =('+ @Id+')'          
            print (@squery)

            set @squery += 'UPDATE A SET A.cGender=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B WHERE A.cGender=B.[Key] AND B.[Column]=N'Gender' AND A.AccountId = ('+@Id+')

            UPDATE A SET A.cHouseholdIncome=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B WHERE A.cHouseholdIncomeCode=B.[Key] AND B.[Column]=('+HouseholdIncome+')  AND A.AccountId = ('+@Id+')

            UPDATE A SET A.cPresenceOfChild=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B WHERE A.cPresenceOfChild=B.[Key] AND B.[Column]=('+PresenceOfChild+') AND A.AccountId = ('+@Id+')'
        END
    END  
END

但它给出错误说明

Msg 156, Level 15, State 1, Procedure spFileProcess, Line 6 Incorrect syntax near the keyword 'AS'. Msg 102, Level 15, State 1, Procedure spFileProcess, Line 26 Incorrect syntax near 'Gender'. Msg 102, Level 15, State 1, Procedure spFileProcess, Line 48 Incorrect syntax near 'False'

我编辑

ALTER PROCEDURE [dbo].[spname]
     @Id INT = 1 ,
     @Flag varchar(MAX) = 'Process',
     @TableName nvarchar(max) = 'SONY'  
AS  
BEGIN    
    IF(@Flag='Process')  
    BEGIN   
    DECLARE @squery nvarchar(max) = ''
    print ('call')
    IF EXISTS(SELECT NAME FROM [DZ_REPO].SYS.TABLES WHERE NAME = @TABLENAME)
        BEGIN
            set @squery = 'use [DZ_REPO]'
            print (@squery)
            set @squery += 'UPDATE A SET A.cFirstName=B.FN, A.cLastName=B.LN, A.cAddress=B.ADDR, A.cCity=B.CITY, A.cState=B.ST, A.cZIP=B.ZIP, 
            A.cGender=B.GENDER, A.cAge=B.EXACT_AGE, A.cHouseholdIncomeCode=B.HH_INCOME FROM [dbo].['+@TableName+'] as A, [Consumer].[dbo].[CONSUMERDB] as B 
            WHERE A.Email=B.Email AND A.AccountId =('+ @Id+')'          
            print (@squery)

            set @squery += 'UPDATE A SET A.cGender=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B WHERE A.cGender=B.[Key] AND B.[Column]=N'Gender' AND A.AccountId = ('+@Id+')

            UPDATE A SET A.cHouseholdIncome=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B WHERE A.cHouseholdIncomeCode=B.[Key] AND B.[Column]=('+HouseholdIncome+')  AND A.AccountId = ('+@Id+')

            UPDATE A SET A.cPresenceOfChild=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B WHERE A.cPresenceOfChild=B.[Key] AND B.[Column]=('+PresenceOfChild+') AND A.AccountId = ('+@Id+')'
        END
    END  
END 

但是没有一个打印被调用并且错误抛出如下

消息 207,级别 16,状态 1,过程 spFileProcess,第 28 行 列名称无效 'Gender'。 消息 207,级别 16,状态 1,过程 spFileProcess,第 30 行 列名称无效 'HouseholdIncome'。 消息 207,级别 16,状态 1,过程 spFileProcess,第 32 行 列名无效 'PresenceOfChild'.

虽然这个专栏已经在mttable

有什么解决办法吗?

您需要 space 在第一个 Update 语句和第二个 Update 语句之间。

...A.AccountId =('+ @Id+')' and set @squery += 'UPDATE A....

应该改为

...A.AccountId =('+ @Id+')' and set @squery += ' UPDATE A...

如果在dynamic Sql execution之前print,调试会很容易。您正在中间打印 @squery,即使在那之后您正在附加 Update 语句,因此它最好是 print 并在附加所有 update statements.

后检查

varchar 列的值也应该用 single quotes 括起来。

确保将 values 传递给所有 variables 否则你 @squery 将是 NULL

set @squery = 'use [DZ_REPO]'

set @squery += 'UPDATE A SET A.cFirstName=B.FN, A.cLastName=B.LN, A.cAddress=B.ADDR, A.cCity=B.CITY, A.cState=B.ST, A.cZIP=B.ZIP, 
            A.cGender=B.GENDER, A.cAge=B.EXACT_AGE, A.cHouseholdIncomeCode=B.HH_INCOME FROM [dbo].['+@TableName+'] as A, [Consumer].[dbo].[CONSUMERDB] as B 
            WHERE A.Email=B.Email AND A.AccountId =('+ @Id+')'          
            print (@squery)

 set @squery += 'UPDATE A SET A.cGender=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B 
                WHERE A.cGender=B.[Key] 
                AND B.[Column]=N'''Gender''' --Here
                AND A.AccountId = ('+@Id+')

 UPDATE A SET A.cHouseholdIncome=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B 
 WHERE A.cHouseholdIncomeCode=B.[Key] 
 AND B.[Column]=('''+HouseholdIncome+''')  
 AND A.AccountId = ('+@Id+')

 UPDATE A SET A.cPresenceOfChild=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B 
 WHERE A.cPresenceOfChild=B.[Key] 
 AND B.[Column]=('''+PresenceOfChild+''') --here
 AND A.AccountId = ('+@Id+')'

我认为你需要像这样在你的查询字符串中添加 space

set @squery = 'use [DZ_REPO] '
set @squery += 'UPDATE A SET A.cFirstName......'

并在 @TableName nvarchar(max)

之后删除 ,

第一个错误: 从@TableName nvarchar(max) 变量的末尾删除逗号 (,)。 第二个错误:如果要在其上传递一些动态值,则需要声明 Gender、HouseholdIncome、HouseholdIncome、PresenceOfChild。或者如果这个 if 列名然后从中删除 +(加号)。

例如: AND B.[列]=(家庭收入)

检查此 sql 并发表评论(这是您的第一个 sql post):

ALTER PROCEDURE [dbo].[spname]
     @Id INT ,
     @Flag varchar(MAX),
     @TableName nvarchar(max),  --remove comma from here
AS  
BEGIN    
    IF(@Flag='Process')  
    BEGIN   
    DECLARE @squery nvarchar(max) = ''

    IF EXISTS(SELECT NAME FROM master.SYS.TABLES WHERE NAME = @TABLENAME)
        BEGIN
            set @squery = 'use [DZ_REPO]'
            set @squery += 'UPDATE A SET A.cFirstName=B.FN, A.cLastName=B.LN, A.cAddress=B.ADDR, A.cCity=B.CITY, A.cState=B.ST, A.cZIP=B.ZIP, 
            A.cGender=B.GENDER, A.cAge=B.EXACT_AGE, A.cHouseholdIncomeCode=B.HH_INCOME FROM [dbo].['+@TableName+'] as A, [Consumer].[dbo].[CONSUMERDB] as B 
            WHERE A.Email=B.Email AND A.AccountId =('+ @Id+')'          
            print (@squery)

            --if 'Gender' id your fixed column then give as below with double comma
            --HouseholdIncome - where you define this variable and assign it
            --PresenceOfChild - where you define this variable and assign it
            set @squery += 'UPDATE A SET A.cGender=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B WHERE A.cGender=B.[Key] AND B.[Column]=N''Gender'' AND A.AccountId = ('+@Id+')

            UPDATE A SET A.cHouseholdIncome=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B WHERE A.cHouseholdIncomeCode=B.[Key] AND B.[Column]=('+HouseholdIncome+')  AND A.AccountId = ('+@Id+')

            UPDATE A SET A.cPresenceOfChild=B.[Value] FROM [dbo].['+@TableName+'] as A, [dbo].[abc] as B WHERE A.cPresenceOfChild=B.[Key] AND B.[Column]=('+PresenceOfChild+') AND A.AccountId = ('+@Id+')'
        END
    END  
END