Heim > Datenbank > MySQL-Tutorial > Hauptteil

Ausführliche Erläuterung der Verwendung nicht dynamischer SQL Server-SQL-Anweisungen zum Ausführen dynamischer Abfragen

怪我咯
Freigeben: 2017-07-05 11:06:00
Original
1851 Leute haben es durchsucht

In diesem Artikel geht es hauptsächlich um nicht dynamische SQL Server-SQL-Anweisungen zum Ausführen dynamischer Abfragen. Im tatsächlichen Betrieb habe ich versucht, eine Reihe von durch Kommas getrennten Werten in einer gespeicherten Prozedur zu übergeben Begrenzen Sie die Ergebnismenge. Aber immer wenn ich die Variable in der IN-Klausel verwende, erhalte ich die Fehlermeldung

In diesem Artikel geht es hauptsächlich um die Dynamik der nicht dynamischen Ausführung von SQL ServerSQL-Anweisungen Abfrage: Im tatsächlichen Betrieb habe ich versucht, eine Reihe von durch Kommas getrennten Werten in einer gespeicherten Prozedur zu übergeben, um die Ergebnismenge einzuschränken. Aber immer wenn ich eine Variable in einer IN-Klausel verwende, erhalte ich eine Fehlermeldung.

Gibt es eine Möglichkeit, die Abfrage abzuschließen, ohne eine dynamische SQL-Anweisung auszuführen?

Ich habe versucht, eine Reihe von durch Kommas getrennten Werten in einer gespeicherten Prozedur zu übergeben, um die Ergebnismenge einzuschränken. Aber immer wenn ich eine Variable in einer IN-Klausel verwende, erhalte ich eine Fehlermeldung. Gibt es eine Möglichkeit, die Abfrage abzuschließen, ohne dynamische SQL ServerSQL-Anweisungen auszuführen?

Expertenantwort:

Es gibt eine Möglichkeit, die Abfrage abzuschließen, ohne dynamische SQL ServerSQL-Anweisungen auszuführen . Es gibt Möglichkeiten, die Abfrage abzuschließen, aber lassen Sie uns zunächst dieses Problem untersuchen. In den folgenden Beispielen werde ich die AdventureWorks-Datenbank verwenden.

Wenn Sie nur einen Wert haben, ist die Ausführung kein Problem.

Declare @ManagerIDs Varchar(100) 
Set @ManagerIDs = '3' 
Select * from HumanResources.Employee 
Where ManagerID IN (@ManagerIDs)
Nach dem Login kopieren

Sobald Sie jedoch das Komma hinzufügen, sieht das Ergebnis ungefähr wie folgt aus:

Declare @ManagerIDs Varchar(100) 
Set @ManagerIDs = '3,6' 
Select * from HumanResources.Employee 
Where ManagerID IN (@ManagerIDs) 
Msg 245, Level 16, State 1, Line 4 
Conversion failed when converting the varchar value '3,6' to data type int.
Nach dem Login kopieren

Dies liegt daran, dass SQL Sever erkennt, dass die ManagerID-Spalte eine Ganzzahl ist, also wird dies der Fall sein Konvertieren Sie die @ManagerIDs automatisch in eine Variable.

Um dieses Problem zu lösen, können Sie dynamisches SQL verwenden, um diese Anweisung auszuführen. Auf diese Weise können Sie die gesamte Abfrage dynamisch erstellen, bevor Sie sie ausführen.

Declare @ManagerIDs Varchar(100) 
Set @ManagerIDs = '3,6' 
Declare @SQL Varchar(1000) 
Set @SQL = 
'Select * from HumanResources.Employee 
Where ManagerID IN (' + @ManagerIDs + ')' 
EXEC (@SQL)
Nach dem Login kopieren

Dadurch können Sie die Abfrage ausführen, dynamisches SQL ist jedoch gefährlich und wird in bestimmten Organisationen möglicherweise nicht einmal verwendet.

Wie führt man also eine Abfrage aus, ohne dynamisches SQL zu verwenden?

Im ersten Schritt müssen Sie ein XML-Feld aus einer durch Kommas getrennten Zeichenfolge generieren.

Declare @ManagerIDs Varchar(100) 
Set @ManagerIDs = '3,6' 
DECLARE @XmlStr XML 
SET @XmlStr = 
--Start Tag 
'' + 
--Replace all commas with an ending tag and start a new tag 
REPLACE( @ManagerIDs, ',', '') + 
--End Tag 
''
Nach dem Login kopieren

Als nächstes wählen Sie den XML-Wert aus und die Ergebnisse werden wie folgt angezeigt:

Select @XmlStr
Nach dem Login kopieren

Da Sie nun ein XML-Feld haben, können wir es abfragen und die Ergebnisse werden in einer Zeile angezeigt zeilenweise wie folgt:

SELECT x.ManagerID.value('.', 'INT') AS A 
FROM @XmlStr.nodes('//ManagerID') x(ManagerID)
Nach dem Login kopieren

Jetzt können Sie die Ergebnisse mithilfe der vorherigen Abfrage einschränken:

SELECT * 
FROM HumanResources.Employee 
WHERE ManagerID IN( 
SELECT x.ManagerID.value('.', 'INT') AS A 
FROM @XmlStr.nodes('//ManagerID') x(ManagerID) 
)
Nach dem Login kopieren

Alternativ können Sie den Inner Join verwenden, um die Ergebnisse einzuschränken:

SELECT * 
FROM HumanResources.Employee AS A 
INNER JOIN 
(SELECT x.ManagerID.value('.', 'INT') AS ManagerID 
FROM @XmlStr.nodes('//ManagerID') x(ManagerID)) B 
ON A.ManagerID = B.ManagerID
Nach dem Login kopieren

Oben ist der relevante Inhalt die Beschreibung nicht dynamischer SQL ServerSQL-Anweisungen, die dynamische Abfragen ausführen. Ich hoffe, dass sie Ihnen diesbezüglich etwas Hilfe bringen.

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Verwendung nicht dynamischer SQL Server-SQL-Anweisungen zum Ausführen dynamischer Abfragen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!