27,582
社区成员




WITH test AS (
SELECT 1 RN,
Convert(decimal(18,2),RAND()*1000) AS InStore,
Convert(decimal(18,2),RAND()*1000) AS OutStore
UNION ALL
SELECT RN+1,
Convert(decimal(18,2),RAND(RN*OutStore)*1000) AS InStore,
Convert(decimal(18,2),RAND(RN+InStore)*1000) AS OutStore
FROM test
WHERE RN < 1000
)
,CTE AS (
SELECT RN,
Convert(decimal(18,2), InStore - OutStore) AS Stock
FROM test
WHERE RN = 1
UNION ALL
SELECT t.RN,
Convert(decimal(18,2), c.Stock + t.InStore - t.OutStore) AS Stock
FROM CTE c
JOIN test t
ON t.RN = c.RN + 1
)
SELECT t.RN,
t.InStore,
t.OutStore,
c.Stock
FROM CTE c
JOIN test t
ON t.RN = c.RN
option (maxrecursion 0)
IF OBJECT_ID('#MYTEST20141020')IS NOT NULL
DROP TABLE #MYTEST20141020
CREATE TABLE #MYTEST20141020(
A INT,
B INT
)
GO
DECLARE @TEMP NUMERIC(18,2)
SET @TEMP=1000
DECLARE @INDEX INT
SET @INDEX=1
WHILE @INDEX<=1000
BEGIN
INSERT INTO #MYTEST20141020
SELECT CAST(RAND()*@TEMP AS NUMERIC(18,2)),CAST(RAND()*@TEMP AS NUMERIC(18,2))
UNION ALL SELECT CAST(RAND()*@TEMP AS NUMERIC(18,2)),CAST(RAND()*@TEMP AS NUMERIC(18,2))
UNION ALL SELECT CAST(RAND()*@TEMP AS NUMERIC(18,2)),CAST(RAND()*@TEMP AS NUMERIC(18,2))
UNION ALL SELECT CAST(RAND()*@TEMP AS NUMERIC(18,2)),CAST(RAND()*@TEMP AS NUMERIC(18,2))
UNION ALL SELECT CAST(RAND()*@TEMP AS NUMERIC(18,2)),CAST(RAND()*@TEMP AS NUMERIC(18,2))
UNION ALL SELECT CAST(RAND()*@TEMP AS NUMERIC(18,2)),CAST(RAND()*@TEMP AS NUMERIC(18,2))
UNION ALL SELECT CAST(RAND()*@TEMP AS NUMERIC(18,2)),CAST(RAND()*@TEMP AS NUMERIC(18,2))
UNION ALL SELECT CAST(RAND()*@TEMP AS NUMERIC(18,2)),CAST(RAND()*@TEMP AS NUMERIC(18,2))
UNION ALL SELECT CAST(RAND()*@TEMP AS NUMERIC(18,2)),CAST(RAND()*@TEMP AS NUMERIC(18,2))
UNION ALL SELECT CAST(RAND()*@TEMP AS NUMERIC(18,2)),CAST(RAND()*@TEMP AS NUMERIC(18,2))
SET @INDEX=@INDEX+1
END
GO
--以上测试数据
--以下游标
DECLARE @STARTTIME DATETIME
SET @STARTTIME=GETDATE()
DECLARE MYCURSOR CURSOR SCROLL FOR
SELECT * FROM #MYTEST20141020
OPEN MYCURSOR
DECLARE @T AS TABLE(A NUMERIC(18,2), B NUMERIC(18,2),ER NUMERIC(18,2))
DECLARE @A NUMERIC(18,2),@B NUMERIC(18,2),@ER NUMERIC(18,2)
SET @ER=0
FETCH NEXT FROM MYCURSOR INTO @A,@B
WHILE @@FETCH_STATUS=0
BEGIN
SET @ER=@ER+@A-@B
INSERT INTO @T
SELECT @A,@B,@ER
FETCH NEXT FROM MYCURSOR INTO @A,@B
END
CLOSE MYCURSOR
DEALLOCATE MYCURSOR
SELECT * FROM @T
SELECT DATEDIFF(MS,@STARTTIME,GETDATE())[毫秒]
GO
DROP TABLE #MYTEST20141020
不知道数据模仿得对不对,游标神速~~