2016-03-24 8 views
-1

Ich muss 1 Datensatz zu einer Zeit zu einer Tabelle senden (Ja 1 Datensatz zu einem Zeitpunkt). Ich habe diesen Code verwendet, um die @msg Variable in SQL Server 2012 (es verwendet OFFSET).Verwendet OFFSET in SQL Server 2012 und ich brauche und antworte für SQL Server 2008

@msg ist eine XML Variable.

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 

Ich habe versucht (und verwirrt), dies im Jahr 2008 einzurichten.

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>' 

mag diese nicht die WHERE

Oder wie diese dies nicht mag die WITH

I 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>' 

verwenden, haben auch versucht, SELECT * (SELECT *, ROW_NUMBER() ....

Antwort

0

zu wher anwenden e-Klausel für eine Spalte, müssen Sie eine abgeleitete Tabelle verwenden, mit so etwas wie folgt aus:

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>' 

Die Tabelle auch einen Alias ​​muss haben, habe ich hier X. Außerdem kann die Reihenfolge nicht da sein, weil es nicht erlaubt ist (und da Sie eine Zeile zurückgeben, wird die Reihenfolge nicht wirklich benötigt).

Anstelle von select * müssen Sie wahrscheinlich die richtigen Spalten angeben.

+0

Die OVER (Reihenfolge von) muss vorhanden sein, wenn RANK verwendet wird. Danke für die Antwort es funktioniert gut. Die Rptlr-Tabelle repliziert in das Web, und die Daten werden als Referenz für History verwendet. Mit Select * werden also alle Felder in der Tabelle abgerufen. –

Verwandte Themen