Einfügen von Daten in verschiedenen Tabellen in einer gespeicherten Prozedur

Folgenden ist die original-SP, die immer Einsätze in Tabelle1 ("INSERT INTO Tabelle1). Jetzt muss ich entweder einfügen in Tabelle1 oder Tabelle2, die beide haben die gleiche Struktur.

Habe ich versucht zu übergeben, der Tabellenname als parameter in SP.

ALTER PROCEDURE [dbo].[sp_importStats] (
@accountID BIGINT,  
@csvFileName VARCHAR (1024),
@csvFormatFileName VARCHAR (1024)
@tableName VARCHAR(256))

Dann habe ich versucht zu EINFÜGEN mit EXECUTE wie folgt:

--Incorrect syntax near EXECUTE.
EXECUTE(    
'INSERT INTO '+ @tableName + '(accountId, date, cost)
(SELECT cte.id, ms.date, ms.cost
FROM #stats ms
INNER JOIN CTE cte ON ms.accountNumber = cte.key4)');

Dann habe ich versucht, dieses:

--Must declare the table variable @tableName.
INSERT INTO @tableName (accountId, date, cost)
(SELECT cte.id, ms.date, ms.cost
FROM #stats ms
INNER JOIN CTE cte ON ms.accountNumber = cte.key4);

Dann habe ich versucht mich nicht zu übergeben, der Tabellenname und anstatt einen booleschen Wert übergeben in SP und auf dieser Basis entscheiden Sie, welche Tabelle muss ich einfügen:

ALTER PROCEDURE [dbo].[sp_importStats] (
@accountID BIGINT,  
@csvFileName VARCHAR (1024),
@csvFormatFileName VARCHAR (1024),
@condition BIT = 0)

IF (@condition= 0)
SET @table = 'table1'
ELSE    
SET @table = 'table2'

--Must declare the table variable "@table".
INSERT INTO @table (accountId, date, cost)
(SELECT cte.id, ms.date, ms.cost
FROM #sats ms
INNER JOIN CTE cte ON ms.accountNumber = cte.key4);

Bekam ich Fehler oder so. Würden Sie bitte lassen Sie mich wissen, was ist der beste Weg, dies zu behandeln? Warum erhalte ich diesen Fehler? Jede Hilfe wird sehr geschätzt.

Original SP:

ALTER PROCEDURE [dbo].[sp_importStats] (
@accountID BIGINT,  
@csvFileName VARCHAR (1024),
@csvFormatFileName VARCHAR (1024))

AS
BEGIN

CREATE TABLE #stats(
    [accountID]        [bigint]         NOT NULL,
    [accountNumber]    [varchar](30)        NULL,
    [date]             [datetime]       NOT NULL,       
    [cost]             [money]              NULL,       
);

EXECUTE('INSERT INTO #stats SELECT * FROM '+
    'OPENROWSET (BULK N''' + @csvFileName + '''' +      
    ',FORMATFILE='''+@csvFormatFileName+''''+
    ',FIRSTROW=2'+
    ',MAXERRORS=0'+
    ') AS t;');     

WITH CTE(id, key4) AS (
    SELECT  A.id, A.[key4]
    FROM    VA A (NOLOCK)
    WHERE   A.id = @accountID
    UNION ALL
    SELECT  A.id, A.[key4]
    FROM    VA A (NOLOCK)
    INNER JOIN CTE ON (CTE.id = A.MAID)
    WHERE A.key4 IS NOT NULL
)

INSERT INTO table1 (accountId, date, cost)
(SELECT cte.id, ms.date, ms.cost
FROM #stats ms
INNER JOIN CTE cte ON ms.accountNumber = cte.key4);

DROP TABLE #stats;

END

Dies ist, was ich jetzt habe:

ALTER PROCEDURE [dbo].[sp_importStats] (
@accountID BIGINT,  
@csvFileName VARCHAR (1024),
@csvFormatFileName VARCHAR (1024)
@tableName VARCHAR(256))

AS
BEGIN

DECLARE @sql NVARCHAR(MAX);

CREATE TABLE #stats(
    [accountID]        [bigint]         NOT NULL,
    [accountNumber]    [varchar](30)        NULL,
    [date]           [datetime]       NOT NULL,     
    [cost]             [money]              NULL,       
);

EXECUTE('INSERT INTO #stats SELECT * FROM '+
    'OPENROWSET (BULK N''' + @csvFileName + '''' +      
    ',FORMATFILE='''+@csvFormatFileName+''''+
    ',FIRSTROW=2'+
    ',MAXERRORS=0'+
    ') AS t;');     

WITH CTE(id, key4) AS (
    SELECT  A.id, A.[key4]
    FROM    VA A (NOLOCK)
    WHERE   A.id = @accountID
    UNION ALL
    SELECT  A.id, A.[key4]
    FROM    VA A (NOLOCK)
    INNER JOIN CTE ON (CTE.id = A.MAID)
    WHERE A.key4 IS NOT NULL
)

--Incorect synstax near SET.
SET @sql = 'INSERT INTO '+ QUOTENAME(@tableName) + '(accountId, date, cost)
(SELECT cte.id, ms.date, ms.cost
FROM #stats ms
INNER JOIN CTE cte ON ms.accountNumber = cte.key4)';

EXECUTE sp_executesql @sql;

DROP TABLE #stats;

END
InformationsquelleAutor blueSky | 2014-01-02
Schreibe einen Kommentar