将Column name输入到Variable并使用Cursor

时间:2017-01-27 15:27:57

标签: sql-server tsql cursor dynamic-sql

尝试从表中输入表名和列名(具有要修改的表和列的列名)并修改表的列值(从哪个表中接收的输入要修改)

DECLARE @TABLE_1 NVARCHAR(MAX)--Passing Table name  to Modify
DECLARE @COLUMN_NAME NVARCHAR(300)--Passing Column name to modify
DECLARE INPUT_CURSOR CURSOR FOR 
/*Actual Table contains which Table and Column to modify*/
SELECT TABLE_NAME,COLUMN_NAME FROM INPUT
OPEN INPUT_CURSOR
FETCH NEXT FROM INPUT_CURSOR INTO @TABLE_1, @COLUMN_NAME
WHILE @@FETCH_STATUS=0
BEGIN
SET @TABLE_1='TABLE_NAME'-- INPUT TABLE_NAME
SET @COLUMN_NAME='COLUMN_NAME'--INPUT COLUMN_NAME
DECLARE @EXEC_SQL NVARCHAR(MAX)--To execute Dynamic SQL Update Statement
SET @EXEC_SQL= 'UPDATE'+'  ['+@TABLE_1+'] '+'SET'+'
'+@COLUMN_NAME+'=REVERSE( (999999999-'+@COLUMN_NAME+'))'
EXEC(@EXEC_SQL)
FETCH NEXT FROM INPUT_CURSOR INTO @TABLE_1,@COLUMN_NAME
END
CLOSE INPUT_CURSOR
DEALLOCATE INPUT_CURSOR

Receiving Error
Msg 208, Level 16, State 1, Line 1
Invalid object name 'TABLE_NAME'.
Msg 208, Level 16, State 1, Line 1
Invalid object name 'TABLE_NAME'.
Msg 208, Level 16, State 1, Line 1
Invalid object name 'TABLE_NAME'.
Msg 208, Level 16, State 1, Line 1
Invalid object name 'TABLE_NAME'.

2 个答案:

答案 0 :(得分:0)

你的问题可能就在这里:

SET @TABLE_1='TABLE_NAME'-- INPUT TABLE_NAME
SET @COLUMN_NAME='COLUMN_NAME'--INPUT COLUMN_NAME

Fetch语句将值放入每条记录的变量中。在这些set语句中,您将它们重新设置为' TABLE_NAME'的静态值。和

答案 1 :(得分:0)

DECLARE INPUT_CURSOR CURSOR FOR 

/*Actual Table contains which Table and Column to modify*/
SELECT TABLE_NAME, COLUMN_NAME FROM INPUT 

/*Cursor invokes each table and column name to be modified Passed to
@Table_1,@Column_Name*/
OPEN INPUT_CURSOR
DECLARE @TABLE_1 NVARCHAR(300)--Passing Table name  to Modify
DECLARE @COLUMN_NAME NVARCHAR(300)--Passing Column name to modify
FETCH NEXT FROM INPUT_CURSOR INTO @TABLE_1, @COLUMN_NAME
WHILE @@FETCH_STATUS=0
BEGIN
DECLARE @EXEC_SQL NVARCHAR(MAX)--To execute Dynamic SQL Update Statement
SET @EXEC_SQL= 'UPDATE'+'  ['+@TABLE_1+'] '+'SET'+'  '+@COLUMN_NAME+ 
'=REVERSE( (999999999-'+@COLUMN_NAME+'))'
EXEC(@EXEC_SQL)
FETCH NEXT FROM INPUT_CURSOR INTO @TABLE_1,@COLUMN_NAME
END
CLOSE INPUT_CURSOR
DEALLOCATE INPUT_CURSOR