2011-04-26 66 views
2

鉴于下面的代码片断(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 

THX任何的窍门 sl3dg3

+2

你需要寻找到[动态SQL](http://www.sommarskog.se/dynamic_sql.html) – 2011-04-26 14:26:32

回答

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相关的安全和性能问题 - 我不知道你怎么会填充的变量,在这里,有可能是在做一些明确的危险这个。

编辑:添加完整的代码。

+0

THX - 这只是我个人用一个脚本,所以这里没有安全隐患。你能给我一个例子如何使用这个游标? – sl3dg3 2011-04-26 14:31:28

+0

新增 - 必须创建临时表,以便您可以选择临时表,如果您在动态SQL中创建它,则光标将无法看到它(除非使用全局光标)。 – 2011-04-26 14:43:18

+0

看起来不错 - 只是因为某些原因我无法选择'newcol'!在select语句(倒数第二行)中,出现以下错误:'无效的列名'newcol'.' – sl3dg3 2011-04-26 14:55:48

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 ''%''[email protected]+''%'';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