web-dev-qa-db-ja.com

SQL Server 2008 R2で一部の値をループするカーソルを宣言する

インド、インターナショナル、米国、英国などの事業部門があります。

しなければならない:

  1. ストアドプロシージャSP_Report結果セットと一致する列を持つテーブル変数(仮想インメモリテーブル)を作成します
  2. すべてのビジネスユニットを含むカーソルを宣言すると、カーソルはBUをループします。
  3. 各BUについて、SP_Reportというストアドプロシージャを実行し、データをテーブル変数に挿入します。
  4. 最後に、テーブル変数+タイムスタンプ+ BUから列を選択し、それらを別のテーブルに挿入して、テーブル変数をクリアする必要があります。

コード:

declare @K table (BU nvarchar(max), K nvarchar(max),Y money, A money, D money, YP money)
declare @FY int
declare @BU nvarchar(max)

INSERT INTO @K (BU, K, Y, A, D, YP) 
    EXEC dbo.SP_Report '2012', 'India'

SELECT * FROM @K

このコードは、テーブル変数の結果を返します。今はカーソルを使用する必要がありますが、その方法はわかりません。どうすれば同じことを解決できますか。

5
Pankaj

DECLARE CURSOR のMSDN/BOLトピックには、カーソル使用の構文例が含まれています。とは言っても、今朝電車に5分の余裕があったので...

-- Create temporary table for Business Units (replace with the "real" table)
DECLARE @BusinessUnit TABLE (BU NVARCHAR(MAX))

INSERT @BusinessUnit
SELECT 'India' UNION SELECT 'International' UNION SELECT 'US' UNION SELECT 'UK'

DECLARE @K TABLE (BU NVARCHAR(MAX),K NVARCHAR(MAX),Y MONEY,A MONEY,D MONEY,YP MONEY)
DECLARE @FY INT
DECLARE @BU NVARCHAR(MAX)

SET @FY = 2012

DECLARE BU_cursor CURSOR FAST_FORWARD FOR
SELECT BU FROM @BusinessUnit

OPEN BU_cursor
FETCH NEXT FROM BU_cursor INTO @BU

WHILE @@FETCH_STATUS = 0
BEGIN
    INSERT @K (BU, K, Y, A, D, YP)
    EXEC dbo.SP_Report @FY, @BU

    FETCH NEXT FROM BU_cursor INTO @BU
END

CLOSE BU_cursor
DEALLOCATE BU_cursor

SELECT * FROM @K
8

これをさらに一歩進めて、次のような内部クエリで動的SQLを実行できますか?

DECLARE @BusinessUnit TABLE (BU NVARCHAR(MAX))
DECLARE @cmd varchar(222)
INSERT @BusinessUnit
SELECT 'India' UNION SELECT 'International' UNION SELECT 'US' UNION SELECT 'UK'

--DECLARE @K TABLE (BU NVARCHAR(MAX),K NVARCHAR(MAX),Y MONEY,A MONEY,D MONEY,YP MONEY)
DECLARE @FY INT
DECLARE @BU NVARCHAR(MAX)

SET @FY = 2012

DECLARE BU_cursor CURSOR FAST_FORWARD FOR
SELECT BU FROM @BusinessUnit

OPEN BU_cursor
FETCH NEXT FROM BU_cursor INTO @BU
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @K TABLE (BU NVARCHAR(MAX),K NVARCHAR(MAX),Y MONEY,A MONEY,D MONEY,YP MONEY)
    --INSERT @K (BU, K, Y, A, D, YP)
    --EXEC dbo.SP_Report @FY, @BU

    SET @cmd = 'INSERT '+@K+' (BU, K, Y, A, D, YP)'+
    ' SELECT '+@BU+','+@BU+',456,78,99,11111'
    EXEC sp_sqlexec @cmd
    FETCH BU_cursor INTO @BU
END
CLOSE BU_cursor
DEALLOCATE BU_cursor

SELECT * FROM @K
2
user43590

カーソルを理解する簡単な例:

DECLARE @CustomerID as INT;
declare @msg varchar(max)
DECLARE @BusinessCursor as CURSOR;

SET @BusinessCursor = CURSOR FOR
SELECT CustomerID FROM Customer WHERE CustomerID IN ('3908745','3911122','3911128','3911421')

OPEN @BusinessCursor;
    FETCH NEXT FROM @BusinessCursor INTO @CustomerID;
    WHILE @@FETCH_STATUS = 0
        BEGIN
            SET @msg = '{
              "CustomerID": "'+CONVERT(varchar(10), @CustomerID)+'",
              "Customer": {
                "LastName": "LastName-'+CONVERT(varchar(10), @CustomerID) +'",
                "FirstName": "FirstName-'+CONVERT(varchar(10), @CustomerID)+'",    
              }
            }|'
        print @msg
    FETCH NEXT FROM @BusinessCursor INTO @CustomerID;
END
0
Agnel Amodia

[〜#〜]カーソル[〜#〜]を簡単に理解するのに最適な例だと思います。

SQL Serverでのカーソルの使用

0
Arsman Ahmad