none
Parameter in dyn.SQL RRS feed

  • 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

    Donnerstag, 29. August 2013 05:20

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

    Donnerstag, 29. August 2013 08:39

Alle Antworten