将 Table 中的游标声明为变量(在 Select 语句中)

Declare a Cursor From a Table as Variable (In the Select-Statement)

我想创建一个具有 2 个字符串参数的 2 table 名称的 SP。在 SP 中,我使用动态 SQL 修改其中一个 table,但另一个在游标内,我不能在 "FOR"[= 之后使用动态 SQL 13=]

ALTER PROCEDURE NameProcedure @SourceTable VARCHAR(100),@DestinationTable VARCHAR(100)
AS
BEGIN
DECLARE @AddressSource VARCHAR(100), @AddressDestination VARCHAR(100)
SELECT @AddressSource = '[Test_Toa].[dbo].[' + @SourceTable + ']'
SELECT @AddressDestination = '[Test_Toa].[dbo].[' + @DestinationTable + ']'
--Source Table columns
DECLARE @id int, @idmercado int, @idcadena int, @barcode nvarchar(255),@Complete_P nvarchar(MAX)

DECLARE @Cursor CURSOR
SET @Cursor = CURSOR FOR 
        --HEREE ITS MY PROBLEM :(!!!!!
    SELECT id, idmercado, idcadena, barcode, precios + ',' FROM @AddressSource
OPEN @Cursor
    FETCH NEXT
        FROM @Cursor INTO @id,@idmercado,@idcadena,@barcode,@Complete_P
    WHILE @@FETCH_STATUS = 0
    BEGIN
        --bla bla code
    FETCH NEXT
                FROM @Cursor INTO @id,@idmercado,@idcadena,@barcode,@Complete_P
    END
CLOSE @Cursor
DEALLOCATE @Cursor  


END

我只想为用户提供的table声明一个游标

嗯,你需要写一个动态的sql语句。只是一个提示。您可以将给定源 table 中的值复制到临时文件 table 中,在临时文件 table 上生成游标,遍历它并随后释放游标并删除临时文件 [=20] =]. :-)

这里有一个简短的演示代码:

DECLARE @sql nvarchar(max), @sourceTable nvarchar(255)

CREATE TABLE dbo.t1(id int, name nvarchar(200))
CREATE TABLE dbo.t2(id int, name nvarchar(200))

SET @sourceTable = N'dbo.t1'

CREATE TABLE #temp(id int, name nvarchar(200))

SET @sql = N'
    INSERT INTO #temp(id,name)
        SELECT id, name
        FROM '+@sourceTable
EXEC(@sql)

DECLARE cur CURSOR FOR
    SELECT id, name
    FROM #temp

OPEN cur

DECLARE @id int, @name nvarchar(200)

FETCH NEXT FROM cur INTO @id, @name

WHILE @@fetch_status = 0 BEGIN
    SELECT @id, @name -- demo output

    FETCH NEXT FROM cur INTO @id, @name
END

-- cleanup
CLOSE cur
DEALLOCATE cur

DROP TABLE dbo.t1
DROP TABLE dbo.t2

DROP TABLE #temp

注意,我只是用记事本写的,没有任何数据库。但我很确定它能完成它的工作。

如果 @sourceTable 的所有可用变体都具有相同的列规范,这才有效。如果没有,您需要从信息架构中提取所需的列并构建更动态的代码。