给出以下代码段(MS SQL):
DECLARE UpdateList CURSOR FOR
SELECT MyColumn FROM MyTable
OPEN UpdateList
到目前为止没有任何幻想。现在我想声明两个变量,我可以将列和表的名称写入。当然,以下是行不通的。我怎样才能做到这一点?
DECLARE @TableName nchar(20) = 'MyTable'
DECLARE @ColumnName nchar(20) = 'MyColumn'
DECLARE UpdateList CURSOR FOR
SELECT @ColumnName FROM @TableName
OPEN UpdateList
任何tipps的Thx sl3dg3
答案 0 :(得分:4)
您必须使用动态SQL - 您不能将参数用作表名或列名。如下所示:
CREATE TABLE #temp (newcol nvarchar(500)) -- Use the type you're getting out of @TableName
DECLARE @TableName nchar(20) = 'MyTable'
DECLARE @ColumnName nchar(20) = 'MyColumn'
EXEC('INSERT INTO #temp SELECT [' + @ColumnName + '] FROM [' + @TableName + ']')
DECLARE UpdateList CURSOR FOR
SELECT newcol FROM #temp
OPEN UpdateList
请记住与动态SQL相关的安全性和性能问题 - 我不知道你将如何填充变量,这里可能存在一些明确的危险。
编辑:添加完整代码。
答案 1 :(得分:0)
此代码是带光标的动态列的一个非常好的示例,因为您不能在@statement中使用“+”。
ALTER PROCEDURE dbo.spTEST
AS
SET NOCOUNT ON
DECLARE @query NVARCHAR(4000) = N''
DECLARE @inputList NVARCHAR(4000) = ''
DECLARE @field sysname = 'fn'
DECLARE @my_cur CURSOR
EXECUTE SP_EXECUTESQL
N'SET @my_cur = CURSOR FAST_FORWARD FOR SELECT
CASE @field
WHEN ''fn'' then fn
END
FROM dbo.vCard WHERE [fn] LIKE ''%''+@query+''%'';OPEN @my_cur;',
N'@field sysname, @query NVARCHAR(4000), @my_cur CURSOR OUTPUT',
@field = @field,
@query = @query,
@my_cur = @my_cur OUTPUT
FETCH NEXT FROM @my_cur INTO @inputList
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @inputList
FETCH NEXT FROM @my_cur INTO @inputList
END
RETURN