如何使用动态 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
我想更新动态生成的 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