Benötigen Sie Hilfe beim Aktualisieren einer Tabelle mit variablen Spalten mit dynamischem SQL

Steve Pantazis

Ich benötige Hilfe bei einem Codeabschnitt in einer gespeicherten Prozedur, der einen Datensatz an eine .NET-App zurückgibt, die einen variablen Satz von Spalten enthält – Standardspalten plus benutzerdefinierte Spalten. Mein Code erstellt eine temporäre Tabelle, die das Dataset enthält, und hängt die benutzerdefinierten Spalten an. Das Problem, das ich habe, ist mit der Auffüllung dieser benutzerdefinierten Spalten. (Mein Code muss übrigens mit Microsoft SQL Server 2008 R2 kompatibel sein).

Ich möchte dynamisches SQL verwenden, um eine Update-Anweisung zusammenzustellen, die die Werte der benutzerdefinierten Spalten in einer temporären Tabelle mithilfe von SQL-Ausschnitten aktualisiert, die in einer Nachschlagetabelle gespeichert sind.

Ein Benutzer möchte beispielsweise ein benutzerdefiniertes Feld, das den Namen eines Mitarbeiters auf eine bestimmte Art und Weise enthält (z. B. "Nachname, Vorname"), so dass der SQL-Ausschnitt für das benutzerdefinierte Feld "Nachname + ', ' + Vorname" lautet, um Verketten Sie die Felder FistName und LastName in der temporären Tabelle. Das ist leicht. Der schwierige Teil ist, wenn das benutzerdefinierte Feld mit einer an den Sproc übergebenen Variablen gefüllt werden muss, um beispielsweise eine eindeutige ID zu erstellen (z. B. das SQL-Snippet für das benutzerdefinierte Feld ist 'Inc_' + CAST(MONTH(@PayrollDate) AS VARCHAR) ', um etwas wie 'Inc_10' zu erhalten, wenn der Eingabeparameter @PayrollDate '10/15/17' ist).

Bist du noch bei mir? Gut, lass uns etwas SQL machen.

Nehmen wir an, wir haben eine temporäre Tabelle mit unseren Standardfeldern und fügen dann ein paar benutzerdefinierte Felder wie folgt hinzu (bitte beachten Sie meine alter table-Methode nicht; in meinem echten Sproc verwende ich dynamisches SQL, um die Felder anzuhängen, basierend auf gespeicherten Werten in einer Nachschlagetabelle).

-- 1. Create the temp table with the standard fields
IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL
DROP TABLE #MyTempTable

CREATE TABLE #MyTempTable (
EmpID VARCHAR(50),
FirstName VARCHAR(100),
LastName VARCHAR(100),
EarningsValue MONEY)

-- 2. Add sample earnings data to the temp table
INSERT INTO #MyTempTable (EmpID,FirstName,LastName,EarningsValue) VALUES('1234','Tom','Jones',525.50)
INSERT INTO #MyTempTable (EmpID,FirstName,LastName,EarningsValue) VALUES('4455','Mary','Smith',800.25)
INSERT INTO #MyTempTable (EmpID,FirstName,LastName,EarningsValue) VALUES('9876','Aaron','Lee',200.00)

-- 3. Add the custom fields to the temp table
ALTER TABLE #MyTempTable ADD EmployeeName VARCHAR(100)
ALTER TABLE #MyTempTable ADD BatchID VARCHAR(50)

Ich kenne zwei Methoden, um dynamisches SQL auszuführen, um meine benutzerdefinierten Felder zu füllen. Die Methode, die teilweise funktioniert, ist die EXEC(@SQL)-Methode, bei der Sie Folgendes tun:

DECLARE @SQL VARCHAR(1000), @CustomField VARCHAR(50), @SQLSnippet VARCHAR(500)
SELECT @CustomField = 'EmployeeName', @SQLSnippet = 'LastName + '','' + FirstName'
SET @SQL = 'UPDATE #MyTempTable SET ' + @CustomField + ' = ' + @SQLSnippet
EXEC(@SQL)

Wenn Sie PRINT @SQL anstelle von EXEC(@SQL) ausführen würden, erhalten Sie:

UPDATE #MyTempTable SET EmployeeName = LastName + ',' + FirstName

Wenn ich SELECT * FROM #MyTempTable auswähle, wird mein benutzerdefiniertes Feld "EmployeeName" gut ausgefüllt.

Die andere zu verwendende dynamische SQL-Methode ist sp_executesql. Wenn ich jedoch versuche, mein UPDATE durchzuführen, erhalte ich NICHTS, da @CustomField in meiner SET-Anweisung nicht erkannt wird.

DECLARE @NSQL NVARCHAR(1000), @CustomField NVARCHAR(50), @SQLSnippet NVARCHAR(500)
SELECT @CustomField = 'EmployeeName', @SQLSnippet = 'LastName + '','' + FirstName'
SET @NSQL = 'UPDATE #MyTempTable SET @CustomField = @SQLSnippet'
EXECUTE sp_executesql @NSQL,N'@CustomField NVARCHAR(50), @SQLSnippet NVARCHAR(500)',@CustomField,@SQLSnippet

Wenn ich @NSQL DRUCKE, erhalte ich UPDATE #MyTempTable SET @CustomField = @SQLSnippet. Das sieht natürlich nicht gut aus, aber theoretisch sollten die an die Felder @CustomField und @SQLSnippet übergebenen Werte funktionieren, oder?

An diesem Punkt denken Sie: "Steve, warum verwenden Sie nicht die Methode EXEC(@SQL) und vergessen den Unsinn von sp_executesql?" Ah, aber es gibt einen Haken.

Wenn ich dynamisches SQL mit einer Variablen im SQL-Snippet verwenden muss, schlägt die EXEC(@SQL)-Methode fehl. Es beschwert sich mit 'Muss die Skalarvariable "@PayrollDate" deklarieren'. "Ja wirklich?" Ja wirklich. Hier, versuch es...

DECLARE @SQL VARCHAR(1000), @CustomField VARCHAR(50), @SQLSnippet VARCHAR(500), @PayrollDate SMALLDATETIME
SET @PayrollDate = '10/15/17'
SELECT @CustomField = 'BatchID', @SQLSnippet = '''INC_'' + CAST(MONTH(@PayrollDate) AS VARCHAR)'
SET @SQL = 'UPDATE #MyTempTable SET ' + @CustomField + ' = ' + @SQLSnippet
EXEC(@SQL)

Nach dem, was ich online recherchiert habe, funktioniert nur sp_executesql mit Parametern in der dynamischen SQL. Allerdings bekomme ich damit immer noch keine Ergebnisse. Hier ist die dynamische SQL mit sp_executesql:

DECLARE @NSQL NVARCHAR(1000), @CustomField NVARCHAR(50), @SQLSnippet NVARCHAR(500), @PayrollDate SMALLDATETIME
SET @PayrollDate = '10/15/17'
SELECT @CustomField = 'BatchID', @SQLSnippet = '''INC_'' + CAST(MONTH(@PayrollDate) AS VARCHAR)'
SET @NSQL = 'UPDATE #MyTempTable SET @CustomField = @SQLSnippet'
EXECUTE sp_executesql @NSQL, N'@CustomField NVARCHAR(50),@SQLSnippet NVARCHAR(500),@PayrollDate SMALLDATETIME',@CustomField,@SQLSnippet,@PayrollDate

Wenn Sie SELECT * FROM #MyTempTable ausführen, ist das benutzerdefinierte BatchID-Feld NULL. Grrrr!

Wie kann ich also das dynamische Ausblenden von SQL dazu bringen, richtig zu funktionieren? Verwende ich die EXEC(@SQL)-Methode oder die sp_executesql-Methode und wie? Sehr geschätzt!

NeugierigKid

Um die Daten in eine Spalte einzufügen, müssen Sie zuerst ADDdie Spalte (mit ihrem Datentyp) in die Tabelle einfügen und weil ALTERund UPDATEnicht im selben Stapel sein können, müssen Sie sie sp_executesqlzweimal verwenden. Unten ist also die Abfrage, die das erreicht, was Sie wollen.

DECLARE @NSQL NVARCHAR(1000),@ALTSQL NVARCHAR(1000), @CustomField NVARCHAR(50), @CustomFieldDataType NVARCHAR(50), @SQLSnippet NVARCHAR(500), @PayrollDate SMALLDATETIME
SET @PayrollDate = '10/15/17'
SELECT @CustomField = 'BatchID', @CustomFieldDataType = ' NVARCHAR(50)', @SQLSnippet = '''INC_'' + CAST(MONTH(@PayrollDate) AS VARCHAR)'
SET @ALTSQL = 'ALTER TABLE #MyTempTable ADD '+ @CustomField + @CustomFieldDataType 
SET @NSQL = 'UPDATE #MyTempTable SET '+ @CustomField +' = '+ @SQLSnippet

EXECUTE sp_executesql @ALTSQL, N'@CustomField NVARCHAR(50), @CustomFieldDataType NVARCHAR(50)',@CustomField, @CustomFieldDataType
EXECUTE sp_executesql @NSQL, N'@CustomField NVARCHAR(50), @SQLSnippet NVARCHAR(500),@PayrollDate SMALLDATETIME',@CustomField, @SQLSnippet,@PayrollDate


SELECT * FROM #MyTempTable

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Benötigen Sie Hilfe beim Aktualisieren einer JSON-Nutzlast mit Go?

Benötigen Sie Hilfe beim Schreiben von SQL-Abfragen mit dynamischen Spalten

Benötigen Sie Hilfe beim Schreiben einer Abfrage mit WHERE?

Benötigen Sie Hilfe beim Speichern des Schemas einer Tabelle in einer Variablen in SSIS

Benötigen Sie Hilfe beim Löschen doppelter Spalten aus einer Tabelle?

Benötigen Sie Hilfe beim Hinzufügen einer Variablen in einer SQL-Abfrage in Python

Benötigen Sie Hilfe beim Vergleichen eines Strings mit einer Listbox mit einer Schleife?

Benötigen Sie SQL-Hilfe: Fügen Sie für jeden Datensatz in Tabelle A (mit mehr Spalten als Tabelle B) in Tabelle B ein

Benötigen Sie Hilfe beim Aktualisieren von Datensätzen mit doppelten Werten in MySQL?

Benötigen Sie Hilfe bei der Verwendung einer PySimpleGUI-TABELLE mit Sqlite3?

Benötigen Sie Hilfe beim Umschreiben von Regex mit nur einer Erfassungsgruppe?

Benötigen Sie Hilfe beim Abrufen einer Liste mit Abfragen von Rails ActiveRecord

Benötigen Sie Hilfe beim Erstellen einer Abfrage mit den folgenden Daten?

Benötigen Sie Hilfe beim Erstellen einer Schleife, die eine Funktion mit den richtigen Argumenten aufruft?

Benötigen Sie Hilfe beim Erstellen einer Ansicht mit zwei verschiedenen Haustierbeträgen?

Benötigen Sie Hilfe beim Extrahieren bestimmter Zeilen aus einer sich ändernden Protokolldatei mit "Expect"?

Benötigen Sie Hilfe beim Lesen einer JSON-Datei mit Groovy und Jenkins?

Benötigen Sie Hilfe beim Erstellen einer visuellen Darstellung der Geräteausrichtung mit JS

Benötigen Sie Hilfe beim Scrapen von Elementen aus einer Liste mit Scrapy mithilfe von Vorfahren?

Benötigen Sie Hilfe beim Abgleichen einer Mattern mit grep / egrep in Bash-Skripten?

Benötigen Sie Hilfe beim Konvertieren einer MySQL-Abfrage mit einem Self-Join in SQLAlchemy?

Benötigen Sie Hilfe beim Animieren einer sich bewegenden Linie mit onDraw () - JAVA

Benötigen Sie Hilfe beim Schreiben einer Abfrage Oracle SQL

Benötigen Sie Hilfe beim Parsen von JSON mit PowerShell?

Benötigen Sie Hilfe beim Speichern von Bildern mit cropIwa?

Benötigen Sie Hilfe beim Aufteilen des Ausdrucks mit Regex?

Benötigen Sie Hilfe beim Parsen von XML mit Innertexten

Benötigen Sie Hilfe beim Tabellenentwurf mit Entity Framework Core

Benötigen Sie Hilfe bei einer Gruppierung mit LINQ in C #?

TOP Liste

  1. 1

    Modbus Python Schneider PM5300

  2. 2

    Wie schließe ich mehrere Ordner mit der Variablen EXTRA_ARGS aus?

  3. 3

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

  4. 4

    Elasticsearch startet nicht nach dem Laden in viele Daten

  5. 5

    ElasticSearch - Knotensperren konnten nicht abgerufen werden

  6. 6

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  7. 7

    Eclipse Oxygen - Projekte verschwinden

  8. 8

    Wie kann ich den Kaskadenmodus global einstellen?

  9. 9

    ElasticSeach Auto Complete mit dem Vervollständigungsvorschlag, um das vollständige Dokument zurückzugeben

  10. 10

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  11. 11

    Bester Crawler, um festzustellen, ob er mit Technologien gebaut wurde?

  12. 12

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  13. 13

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  14. 14

    Wie füge ich eine Spalte in einer Zeile in der Ansible Jinja2-Vorlage mit der for-Schleife hinzu?

  15. 15

    Wie Verwenden von Httpclient mit jedem SSL-Zertifikat, egal wie „schlecht“ es ist

  16. 16

    Wie kann man eine Multi-Container-Anwendung in Steuerkarten erstellen?

  17. 17

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  18. 18

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  19. 19

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  20. 20

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  21. 21

    So erstellen Sie ein langes Etikett inline mit einem Eingabefeld

heißlabel

Archiv