2011-04-26 75 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