Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ein Tabellenname als Variable

Für statische Abfragen, wie die in Ihrer Frage, müssen Tabellennamen und Spaltennamen statisch sein.

Für dynamische Abfragen sollten Sie das vollständige SQL dynamisch generieren und sp_executesql verwenden, um es auszuführen.

Hier ist ein Beispiel für ein Skript, das verwendet wird, um Daten zwischen denselben Tabellen verschiedener Datenbanken zu vergleichen:

Statische Abfrage:

SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]

Da ich den Namen von table einfach ändern möchte und schema , habe ich diese dynamische Abfrage erstellt:

declare @schema varchar(50)
declare @table varchar(50)
declare @query nvarchar(500)

set @schema = 'dbo'
set @table = 'ACTY'

set @query = 'SELECT * FROM [DB_ONE].[' + @schema + '].[' + @table + '] EXCEPT SELECT * FROM [DB_TWO].[' + @schema + '].[' + @table + ']'

EXEC sp_executesql @query

Da dynamische Abfragen viele Details haben, die berücksichtigt werden müssen, und sie schwer zu warten sind, empfehle ich Ihnen die Lektüre:Fluch und Segen von dynamischem SQL