0

SQL Server 2012 を使用しています。

処理のためにテーブルから行を選択する必要があります。行数は可変である必要があります。選択している行を「処理中」ステータスに更新する必要があります。この目的のために入力する GUID があります。

row_number() を使用するいくつかの例と、CTE を使用する方法のいくつかの例に遭遇しましたが、それらを組み合わせる方法 (またはそれが正しい戦略であるかどうか) についてはわかりません。洞察をいただければ幸いです。

これが私がこれまでに持っているものです:

DECLARE @SessionGuid uniqueidentifier,  @rowcount bigint
SELECT @rowcount = 1000
SELECT @sessionguid = newid()

    DECLARE @myProductChanges table (
            ProductChangeId bigint
        ,   ProductTypeId smallint
        ,   SourceSystemId tinyint
        ,   ChangeTypeId tinyint );

    WITH NextPage AS 
    (
       SELECT 
           ProductChangeId, ServiceSessionGuid,
           ROW_NUMBER() OVER (ORDER BY ProductChangeId) AS 'RowNum' 
       FROM dbo.ProductChange
       WHERE 'RowNum' < @rowcount
    )
    UPDATE dbo.ProductChange
    SET ServiceSessionGuid = @sessionguid, ProcessingStateId = 2, UpdatedDate = getdate()
    OUTPUT
        INSERTED.ProductChangeId,
        INSERTED.ProductTypeId,
        INSERTED.SourceSystemId,
        INSERTED.ChangeTypeId
    INTO @myProductChanges
    FROM dbo.ProductChange as pc join NextPage on pc.ProductChangeId = NextPage.ProductChangeId

ここから、一時テーブルから選択してデータを返します。

SELECT mpc.ProductChangeId
    ,   pt.ProductName as ProductType
    ,   ss.Name as SourceSystem
    ,   ct.ChangeDescription as ChangeType
FROM @myProductChanges as mpc 
        join dbo.R_ProductType pt on mpc.ProductTypeId = pt.ProductTypeId
        join dbo.R_SourceSystem ss on mpc.SourceSystemId = ss.SourceSystemId
        join dbo.R_ChangeType ct on mpc.ChangeTypeId = ct.ChangeTypeId
ORDER BY ProductType asc

これまでのところ、これは私にはうまくいきません。実行しようとするとエラーが発生します。

Msg 8114, Level 16, State 5, Line 20
Error converting data type varchar to bigint.

私が間違っていることについてははっきりしていません - だから - どんな助けも大歓迎です。

ありがとう!

ところで、これを試して解決するために参照として使用した質問のいくつかを次に示します。

https://stackoverflow.com/questions/9777178

https://stackoverflow.com/questions/3319842

https://stackoverflow.com/questions/6402103

4

2 に答える 2

2

このサブクエリは意味がありません:

   SELECT 
       ProductChangeId, ServiceSessionGuid,
       ROW_NUMBER() OVER (ORDER BY ProductChangeId) AS 'RowNum' 
   FROM dbo.ProductChange
   WHERE 'RowNum' < @rowcount

同じスコープでエイリアスを参照することはできませんRowNum(とにかく、エイリアスではなく文字列を比較しようとしています)。これは、WHERE句が解析されたときに、SELECTリストがまだ具体化されていないためです。必要なのは、別のネストのいずれかです。

SELECT ProductChangeId, ServiceSessionGuid, RowNum
FROM (SELECT ProductChangeId, ServiceSessionGuid, 
       ROW_NUMBER() OVER (ORDER BY ProductChangeId) AS RowNum
   FROM dbo.ProductChange
) AS x WHERE RowNum < @rowcount

または:

SELECT TOP (@rowcount-1) ProductChangeId, ServiceSessionGuid, 
  ROW_NUMBER() OVER (ORDER BY ProductChangeId) AS RowNum
FROM dbo.ProductChange
ORDER BY ProductChangeId

また、使用をやめてください'alias'- エイリアスを区切る必要がある場合 (この場合は必要ありません)、 を使用して[square brackets]ください。

于 2013-04-19T01:42:01.767 に答える