我想为2个表名创建一个包含2个String参数的SP。在SP中,我使用动态SQL来修改其中一个表,但另一个是在游标中,我不能在" FOR"
之后使用动态SQLALTER 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
我只想为用户提供的表声明一个游标
答案 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的所有可用变体具有相同的列规范,这都适用。如果没有,您需要从信息模式中提取所需的列并构建更动态的代码。