Benutzer mit den meisten Antworten
Parameter in dyn.SQL

Frage
-
Hallo zusammen,
ich habe da mal wieder eine Frage :-)
Derzeit stelle ich meine Scripte um damit diese (für mich) besser lesbar sind, zudem schreibe ich Teile neu und anderst, denn man lernt (hier) ja immer gerne was dazu...
Da ich eigentlich ständig abfragen über alle Datenbanken mache, verwende ich dynamisches SQL da ich hier den Datenbanknamen und Owner/Schema innerhalb eines Cursors verwenden kann.
Nun möchte ich den Datenbanknamen z.Bsp. auch über Parameter übergeben, aber das will nicht so recht.
Im alten Script hatte ich den Datenbanknamen (@engid) wie folgt übergeben:
set @sqlcommand = 'select @ownerOUT = t.TABLE_SCHEMA '+ 'from ['+@engid+'].INFORMATION_SCHEMA.TABLES t '+ 'where t.TABLE_TYPE=''view'' and t.TABLE_SCHEMA <> ''ETL''' set @sqlparameter = N'@ownerOUT nvarchar(max) output' exec sp_executesql @sqlcommand, @sqlparameter, @ownerOUT=@owner output
Nun möchte ich den Datenbanknamen per Parameter übergeben:
set @sqlcommand = 'select @ownerOUT = t.TABLE_SCHEMA '+ 'from [@engidIN].INFORMATION_SCHEMA.TABLES t '+ 'where t.TABLE_TYPE=''view'' and t.TABLE_SCHEMA <> ''ETL''' set @sqlparameter = N'@engidIN nvarchar(max), @ownerOUT nvarchar(max) output' exec sp_executesql @sqlcommand, @sqlparameter, @engidIN=@engid, @ownerOUT=@owner output
Führe ich das Script aus, bekomme ich den Fehler
Msg 208, Level 16, State 1, Line 1 Invalid object name '@engidIN.INFORMATION_SCHEMA.TABLES'.
Was mache ich falsch?
Viele Grüsse,
Maximilian
Antworten
-
...
Msg 208, Level 16, State 1, Line 1 Invalid object name '@engidIN.INFORMATION_SCHEMA.TABLES'.
...
Man sieht daran ja, was "innen" geschieht.
@engid ist nunmal ein Parameter
Eine Abfrage wie diese funktioniert in T-SQL aber nun einmal nicht:
DECLARE @sqlcommand nvarchar(4000), @engid sysname SET @engid = '[AdventureWorksDW2008R2]' set @sqlcommand = 'select * from @engidIN.INFORMATION_SCHEMA.TABLES' print @sqlcommand exec @sqlcommand GO
--ist das gleiche wie: DECLARE @engid sysname SET @engid = '[AdventureWorksDW2008R2]' select * from @engid.INFORMATION_SCHEMA.TABLES
damit ist klar, das der String dynamisch zusammengesetzt werden muss an dieser Stelle ( '+ @var +' )
Stichwort "dynamic string execution"
Andreas Wolter | Microsoft Certified Master SQL Server
Blog: www.insidesql.org/blogs/andreaswolter
Web: www.andreas-wolter.com- Bearbeitet Andreas.WolterMicrosoft employee Donnerstag, 29. August 2013 08:39
- Als Antwort vorgeschlagen Olaf HelperMVP Donnerstag, 29. August 2013 08:40
- Als Antwort markiert Ionut DumaModerator Donnerstag, 5. September 2013 13:59
Alle Antworten
-
...
Msg 208, Level 16, State 1, Line 1 Invalid object name '@engidIN.INFORMATION_SCHEMA.TABLES'.
...
Man sieht daran ja, was "innen" geschieht.
@engid ist nunmal ein Parameter
Eine Abfrage wie diese funktioniert in T-SQL aber nun einmal nicht:
DECLARE @sqlcommand nvarchar(4000), @engid sysname SET @engid = '[AdventureWorksDW2008R2]' set @sqlcommand = 'select * from @engidIN.INFORMATION_SCHEMA.TABLES' print @sqlcommand exec @sqlcommand GO
--ist das gleiche wie: DECLARE @engid sysname SET @engid = '[AdventureWorksDW2008R2]' select * from @engid.INFORMATION_SCHEMA.TABLES
damit ist klar, das der String dynamisch zusammengesetzt werden muss an dieser Stelle ( '+ @var +' )
Stichwort "dynamic string execution"
Andreas Wolter | Microsoft Certified Master SQL Server
Blog: www.insidesql.org/blogs/andreaswolter
Web: www.andreas-wolter.com- Bearbeitet Andreas.WolterMicrosoft employee Donnerstag, 29. August 2013 08:39
- Als Antwort vorgeschlagen Olaf HelperMVP Donnerstag, 29. August 2013 08:40
- Als Antwort markiert Ionut DumaModerator Donnerstag, 5. September 2013 13:59
-
Hallo Maximilian
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.Danke und viele Grüße,
IonutIonut Duma, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.