2016-03-24 5 views
-1

一度に1レコードをテーブルに送信する必要があります(一度に1レコードあります)。 このコードを使用して、SQL Server 2012(オフセットを使用)で変数@msgを設定しました。SQL Server 2012で使用されているOFFSETとSQL Server 2008の必要性と回答

@msgは、変数XMLです。

WHILE @Rowcount > 0 
BEGIN 
    SELECT @Rowcount = @Rowcount - 1 

    SET @msg = '<rptlr>' + (SELECT * FROM Deleted rptlr_d ORDER BY VENDOR 
    OFFSET @Rowcount ROWS FETCH NEXT 1 ROWS ONLY FOR XML AUTO, ELEMENTS) + '</rptlr>' 

    IF @company IS NOT NULL 
     INSERT INTO RPTLR (company, winnam, ddf, action, msg, dsn) 
     VALUES (@company, 'APPU', '000354', 'delete', @msg, @dsn) 
END 

私はこのように2008年に設定しようとしました(混乱しています)。

SET @msg = '<rptlr>' + (SELECT RANK() OVER (ORDER BY VENDOR) AS rank,* 
    FROM Deleted rptlr_d ORDER BY RANK WHERE rank = @Rowcount 
    FOR XML AUTO, ELEMENTS) + '</rptlr>' 

これは私がもSELECT * (SELECT *, ROW_NUMBER() ....

答えて

0

を試してみましたWITH

が好きではありませんROW_NUMBER()

SET @msg = '<rptlr>' + (WITH temp AS (SELECT ROW_NUMBER() OVER (ORDER BY VENDOR) 
    AS RowNum,* FROM Deleted rptlr_d) 
    SELECT * FROM temp WHERE @Rowcount = temp.RowNum FOR XML AUTO, ELEMENTS) 
    + '</rptlr>' 

これを使用してWHERE

またはこのように好きではありません適用する列上の電子句、あなたがこのようなもので、派生テーブルを使用する必要があります。

SET @msg = '<rptlr>' + (select * from (SELECT RANK() OVER (ORDER BY VENDOR) AS rank,* 
FROM #Deleted rptlr_d) X WHERE rank = @Rowcount 
FOR XML AUTO, ELEMENTS) + '</rptlr>' 

表には、別名を持っている必要があり、私はここでXを使用していました。また、許可されていないため、by orderはそこにはありません(また、1行を返すので、order byは本当に必要ありません)。

select *の代わりに、おそらく正しい列を指定する必要があります。

+0

RANKを使用する場合は、OVER(Order by)が必要です。回答ありがとうございます。 rptlrテーブルはWebにレプリケートされ、そのデータは履歴の参照として使用されます。したがって、Select *を使用してテーブル内のすべてのフィールドを取得します。 –

関連する問題