[英]How can cicle Temporary Table with cicle white in stored procedure
我有一个在SQL Server中创建此临时表的存储过程
CREATE TABLE #TeporaryTableAcqua
(
Data DateTime,
Nome NVarchar(100),
Valore Decimal(10,2)
)
在存储过程中,我用任何记录填充该临时表。
--RECUPERO L'ACQUA BEVUTA OGGI
INSERT INTO #TeporaryTableAcqua
SELECT
'ACQUA BEVUTA',
CONVERT(varchar(12), data, 105),
SUM(QUANTITA) * 100
FROM
OmniacareDataProduction.dbo.MV_Acqua A
WHERE
CONVERT(varchar(12), data,105) = CONVERT(varchar(12), GETDATE(), 105)
GROUP BY
CONVERT(varchar(12), data, 105)
现在,我想创建一个cicle来一次选择一行,因此我已经构建了以下代码,但出现错误:
DECLARE @NROW INT
SELECT @NROW = COUNT(*)
FROM #TeporaryTableAcqua
DECLARE @Nome As NVARCHAR(100)
WHILE (@NROW>0)
BEGIN
SELECT @Nome = Nome
FROM #TeporaryTableAcqua
LIMIT 1
EXEC [P_TF_UTILITY_Set_FileBodies]
@FileTempID = @FileTempID,
@FieldID = 8, @Value = @Nome, @RowID = 2, @OrdinalID = 1
DELETE FROM #TeporaryTableAcqua LIMIT 1
SELECT @NROW = COUNT(*)
FROM #TeporaryTableAcqua
END
错误在LIMIT 1
。
我该如何解决?
为了限制该行,sql server中有一个TOP
子句。 sql server中没有任何Limit
类型的东西。
因此,这是您更新的脚本。
DECLARE @NROW INT
SELECT @NROW=COUNT(*) FROM #TeporaryTableAcqua
DECLARE @Nome As NVARCHAR(100)
WHILE (@NROW>0)
BEGIN
Select TOP 1 @Nome=Nome From #TeporaryTableAcqua Order By Nome
EXEC [P_TF_UTILITY_Set_FileBodies] @FileTempID=@FileTempID, @FieldID=8, @Value=@Nome, @RowID = 2, @OrdinalID = 1
--DELETE TOP (1) FROM #TeporaryTableAcqua
DELETE FROM #TeporaryTableAcqua
WHERE Nome = @Nome
SELECT @NROW=COUNT(*) FROM #TeporaryTableAcqua
END
重要的是要记住,执行查询时,其结果将以未定义的顺序返回,除非由order by子句特别指定。
考虑在数据的每一行中构成唯一标识符的因素也很重要。
如果Nome是唯一的,那么下面的代码将为您工作。
如果没有,那么您将必须在order by子句和delete语句的where子句中使用多个字段。
DECLARE @Nome As NVARCHAR(100)
WHILE exists (select * from #TeporaryTableAcqua)
BEGIN
Set @Nome = (Select TOP 1 Nome From #TeporaryTableAcqua Order by Nome asc)
EXEC [P_TF_UTILITY_Set_FileBodies] @FileTempID=@FileTempID, @FieldID=8, @Value=@Nome, @RowID = 2, @OrdinalID = 1
DELETE FROM #TeporaryTableAcqua where Nome = @Nome
END
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.