我想使用動態查詢來聲明遊標。基本上我有我將用作遊標的表值函數的名稱作爲表的列,所以我必須使用SQL語句聲明遊標。如何在T-SQL中動態聲明遊標?
問題是T-SQL不能將myCursor
識別爲有效的遊標。
DECLARE @ColumnA nvarchar(250)
DECLARE @ColumnB nvarchar(250)
DECLARE @FunctionName nvarchar(250)
DECLARE @RecordId nvarchar(250)
DECLARE @sqlStatement nvarchar(MAX)
SET @sqlStatement = 'DECLARE myCursor CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT * FROM ' + @FunctionName + '(''' + @RecordId + ''')'
EXEC sp_executesql @sqlStatement
OPEN myCursor
FETCH NEXT FROM myCursor INTO @ColumnA, @ColumnB
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @ColumnA, @ColumnB
FETCH NEXT FROM myCursor INTO @ColumnA, @ColumnB
END
CLOSE myCursor
DEALLOCATE myCursor
歡迎任何幫助或解決方法。
編輯:我解決了這個問題,通過聲明遊標之前和使用sqlstatement的輸出傳遞值。
DECLARE @myCursor CURSOR
SET @sqlStatement = 'SET @myCursor = CURSOR局部靜態READ_ONLY FORWARD_ONLY FOR SELECT * FROM' + @FunctionName + '(' '' + @RecordId + '''); OPEN @myCursor;」
EXEC sp_executesql的@sqlStatement,N '@佔位符爲nvarchar(250),@Placeholdervalue爲nvarchar(250),@myCursor CURSOR OUTPUT',@Placeholder = @Placeholder,@Placeholdervalue = @Placeholdervalue,@myCursor = @myCursor OUTPUT
這聽起來像一個[xy問題](https://meta.stackexchange.com/q/66377/179361)。你究竟在努力實現什麼?我無法想象這是最好的解決方案。在使用SQL Server的10年中,我可以誠實地說我從未遇到過需要動態聲明的遊標的場景。你怎麼知道你的函數會返回至少兩列?你怎麼知道這些列將是'nvarchar(250)'?你怎麼知道一個有效的函數名已經發布?你怎麼知道你的函數接受一個nvarchar(250)參數? – GarethD