Для статических запросов, таких как в вашем вопросе, имена таблиц и столбцов должны быть статическими.
Для динамических запросов вы должны генерировать полный SQL динамически и использовать sp_executesql для его выполнения.
Вот пример сценария, используемого для сравнения данных между одними и теми же таблицами разных баз данных:
статический запрос:
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
так как я хочу легко изменить имя table
и schema
я создал этот динамический запрос:
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
Поскольку динамические запросы содержат много деталей, которые необходимо учитывать, и их трудно поддерживать, я рекомендую прочитать: Проклятие и благословения динамического SQL
Немного опоздал на ответ, но должен помочь кому-то еще:
источник
COUNT(*)
?Вы не можете использовать имя таблицы для переменной, вам придется сделать это вместо этого:
источник
Вам нужно будет генерировать sql динамически:
источник
Используйте
sp_executesql
для выполнения любого SQL, напримеристочник
Кроме того, вы можете использовать это ...
источник
источник
вам нужно использовать SQL Server динамический SQL
Используйте EXEC для выполнения любого SQL
Используйте EXEC sp_executesql для выполнения любого SQL
Используйте EXECUTE sp_executesql для выполнения любого SQL
источник
источник