Wie Tabelle set name dynamisches SQL Abfrage?
Möchte ich Tabelle set name in einer dynamischen SQL-Abfrage. Ich versuchte erfolgreich die parameter wie folgt:
/* Using sp_executesql */
/* Build and Execute a Transact-SQL String with a single parameter
value Using sp_executesql Command */
/* Variable Declaration */
DECLARE @EmpID AS SMALLINT
DECLARE @SQLQuery AS NVARCHAR(500)
DECLARE @ParameterDefinition AS NVARCHAR(100)
/* set the parameter value */
SET @EmpID = 1001
/* Build Transact-SQL String by including the parameter */
SET @SQLQuery = 'SELECT * FROM tblEmployees WHERE EmployeeID = @EmpID'
/* Specify Parameter Format */
SET @ParameterDefinition = '@EmpID SMALLINT'
/* Execute Transact-SQL String */
EXECUTE sp_executesql @SQLQuery, @ParameterDefinition, @EmpID
Nun möchte ich TABLE NAME
dynamisch mit einem parameter, aber ich habe versäumt, das zu tun. Bitte führe mich.
Können Sie nicht parametrieren, so der name der Tabelle. Sie tun es einfach manuell in der
eigentlich kann man sich pas der name der Tabelle als string und die Verwendung von exec, der string name(Sie Verhalten sich genau wie eine Prozedur)
Und trotzdem sind Sie nicht liefern kann der name der Tabelle als parameter
eigentlich brauchen Sie nicht die "sp_executesql" - Befehl in mssql 2008+ es ist genug, nur zu nennen, die in dieser Weise: exec @ myqueryconcatenatedvariablewithtablename und Sie bekam Ihre Antwort, bezüglich Injektionen - vielleicht hast du Recht(jemand mit Fähigkeiten, die Sie brechen kann). So hängt davon ab, wo er brauchen, um diese zu verwenden, nachdem alle...
Das ist genau der gleiche Mechanismus - Sie sind nur ersetzen Sie der name der Tabelle in Ihren string und dann die Ausführung des resultierenden Strings. An keinem Punkt in deinem Beispiel ist der name der Tabelle ein parameter.
SET @SQLQuery
Schritt.eigentlich kann man sich pas der name der Tabelle als string und die Verwendung von exec, der string name(Sie Verhalten sich genau wie eine Prozedur)
Und trotzdem sind Sie nicht liefern kann der name der Tabelle als parameter
sp_executesql
dies kann nur erreicht werden, mit einer substitution in den string. Diese sind SEHR unterschiedlich. Die Parametrierung ermöglicht die überprüfung von Typ, Schutz vor SQL-Injection-Angriffe, Ausführungsplan wiederverwenden, etc. Ersetzen von Zeichenfolgen in andere Zeichenfolgen tut keiner, und so ist nicht Parametrierung.eigentlich brauchen Sie nicht die "sp_executesql" - Befehl in mssql 2008+ es ist genug, nur zu nennen, die in dieser Weise: exec @ myqueryconcatenatedvariablewithtablename und Sie bekam Ihre Antwort, bezüglich Injektionen - vielleicht hast du Recht(jemand mit Fähigkeiten, die Sie brechen kann). So hängt davon ab, wo er brauchen, um diese zu verwenden, nachdem alle...
Das ist genau der gleiche Mechanismus - Sie sind nur ersetzen Sie der name der Tabelle in Ihren string und dann die Ausführung des resultierenden Strings. An keinem Punkt in deinem Beispiel ist der name der Tabelle ein parameter.
InformationsquelleAutor Neo | 2013-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tabelle von Namen nicht geliefert werden kann, als Parameter, so müssen Sie zum erstellen der SQL-string manuell so:
Jedoch, stellen Sie sicher, dass Ihre Anwendung nicht zulassen, dass Benutzer geben Sie direkt den Wert von
@TableName
, wie diese machen würde, Ihre query anfällig für SQL injection. Für eine mögliche Lösung siehe diese Antwort.Sie sollten in der Lage sein zu verwenden
sp_executesql
da sollte man schon die richtigen Tabellennamen eingefügt, wenn Sie Ihr SQL-string. Dies ist ein Hauptgrund, warum die SQL-strings aufgebaut sind manuell in den ersten Platz.Eine weitere überlegung ist, gelten auch
QuoteName
um die variable. Das wird richtig wickeln der name der Tabelle mit den Objekt-Wrapper, standardmäßig eckige Klammern[...]
InformationsquelleAutor Dan
Zum Schutz vor SQL-injection, ich versuche normalerweise die Funktionen nutzen, wo immer möglich. In diesem Fall könnten Sie tun:
InformationsquelleAutor user1172173
Versuchen Sie dies:
Genial! Löste mein problem perfekt.
Öffnen Sie für SQL-injection. Alles, was Sie tun müssen, ist, übergeben eine schlecht @TableName-parameter wie der 'sys.databaeses; Alter Server-Rolle sysadmin Mitglied Hinzufügen [BadGuy]; -- " und es geht Ihr system.
InformationsquelleAutor Saharsh Shah