将 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 的所有可用变体都具有相同的列规范,这才有效。如果没有,您需要从信息架构中提取所需的列并构建更动态的代码。
我想创建一个具有 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 的所有可用变体都具有相同的列规范,这才有效。如果没有,您需要从信息架构中提取所需的列并构建更动态的代码。