0

我有一個這樣的存儲過程。必須聲明表變量(動態查詢)

ALTER PROCEDURE [dbo].[storedProc_dataPull] 
    @serverName nvarchar(30), 
    @dbName nvarchar(30), 
    @tblName nvarchar(30), 
    @schemaName nvarchar (30), 
    @userID nvarchar (30), 
    @password nvarchar (30), 
    @sampleTbl nvarchar (30) 
AS 
BEGIN 
    DECLARE @schemaAndTbl nvarchar (39) 

    SET @schemaAndTbl = @dbName + '.' + @schemaName + '.' [email protected] 

    EXEC('INSERT INTO @sampleTbl 
     ([ID] 
     ,[ActivityDefinitionID] 
     ,[ParentID] 
     ,[Caption] 
     ,[Description] 
     ,[ShortDescription] 
     ,[Name] 
     ,[Order] 
     ,[ReferenceNumber] 
     ,[ShowOnNavigation] 
     ,[Status] 
     ,[InUseBy] 
     ,[ExpectedStartDate] 
     ,[ActualStartDate] 
     ,[ExpectedEndDate] 

    SELECT * 
    FROM OPENDATASOURCE(''SQLOLEDB'',''Data Source=' + @serverName+ ';User ID='[email protected]+';Password=' [email protected]+''').'[email protected]+' sdb1') 

    UPDATE @sampleTbl 
    SET ServerName = ''[email protected]+'', DBName = ''[email protected]+'' 
    WHERE ServerName IS NULL AND DBName IS NULL 
END 

當我試圖執行,我總是得到一個錯誤:

Must declare the table variable

我的下一個問題是要通過列名作爲參數也是如此。

SQL Server有可能嗎?我只想爲我的應用程序創建一個動態存儲過程。

回答

2

您還沒有在動態查詢中聲明@sampleTbl

而表變量範圍僅限於該批次的執行。並且Exec語句將批量執行語句。因此,聲明,插入,選擇&更新表變量必須和應該在同一批次中。意思是它應該包含在EXEC聲明中。

2問題:我的下一個問題是傳遞列名作爲參數。

是的,它是可能的sp_executesql

看一看sp_executesql (Transact-SQL)的一樣。

0

你可以修改你的語句, 或者你可以定義一個自定義的數據類型基於表變量的結構。比你可以在sp_executesql

INSERT INTO @sampleTbl 
EXEC(' SELECT 
    ([ID] 
    ,[ActivityDefinitionID] 
    ,[ParentID] 
    ,[Caption] 
    ,[Description] 
    ,[ShortDescription] 
    ,[Name] 
    ,[Order] 
    ,[ReferenceNumber] 
    ,[ShowOnNavigation] 
    ,[Status] 
    ,[InUseBy] 
    ,[ExpectedStartDate] 
    ,[ActualStartDate] 
    ,[ExpectedEndDate] 

SELECT * FROM OPENDATASOURCE(''SQLOLEDB'',''Data Source=' + @serverName+ ';User ID='[email protected]+';Password=' [email protected]+''').'[email protected]+' sdb1') 
1

示例表@sampleTbl是您的存儲過程中的參數。這也是類型nvarchar (30)。這是不正確的。我不明白你爲什麼想把這張表作爲參數傳遞給你。如果你想傳遞表作爲參數,那麼你應該聲明它爲一個TYPE並且該表應該作爲READONLY傳遞。您將無法在該表中寫入值。從參數中刪除它,並修改上述答案中提到的查詢。它會工作..

快樂編碼:)