从表中声明一个光标作为变量(在Select-Statement中)

时间:2015-06-17 14:47:36

标签: sql sql-server cursor

我想为2个表名创建一个包含2个String参数的SP。在SP中,我使用动态SQL来修改其中一个表,但另一个是在游标中,我不能在" FOR"

之后使用动态SQL
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

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

1 个答案:

答案 0 :(得分:1)

好吧,你需要编写一个动态的sql语句。就像一个提示。您可以将给定源表中的值复制到临时表中,在临时表上生成游标,迭代它并在之后取消分配游标并删除临时表。 : - )

这是一个简短的演示代码:

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的所有可用变体具有相同的列规范,这都适用。如果没有,您需要从信息模式中提取所需的列并构建更动态的代码。