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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorbei Tabellennamen als Parameter
Verwenden
QUOTENAME() Function
setzen Sie eckige Klammern um deinen Tabellennamen zu erzählen, sql-server explizit, dass es ein Sql Server-Objekt-Namen, so etwas wie dieses ..Verwendung von QUOTENAME () - Funktion können Sie schützen gegen eine mögliche
sql injection attack
. Auch brauchen Sie keine Klammern um die select-Anweisung.Außerdem sollten Sie vermeiden, mit
sp_
Präfix für Sie die gespeicherte Prozedur Namen. Lesen Sie Hier warum.Mit IF..ELSE-Blöcke
N
teilen Sie sql server, kann es einige unicode-Zeichen in der folgende Zeichenfolge ein. ja, Sie können auchIF..ELSE
block, IF..ELSE-Blöcken hat man viel mehr Zeilen code in Ihr proc-wo als dynamische sql erstellt die Abfrage dynamisch für Sie. Ich persönlich würde vermeiden Sie die Verwendung von dynamischem sql, Wann immer möglich.Haben Sie bemerkt, dass Sie fehlten ein Komma in der Deklaration.