Às vezes, acabo em uma posição em que tenho uma versão de string da minha referência de objeto assim:
'server.database.schema.table'
E eu preciso usá-lo como uma referência de objeto real:
'server.database.schema.table'+'.'+[column]
Como faço para transformar essa string em:
[server].[database].[schema].[table]
para que eu possa realmente usá-lo?
Tenho certeza de que isso já foi perguntado antes, e provavelmente é novo, mas não consigo encontrar as palavras-chave corretas. Não estou usando em um EXEC EXECUTE.
De acordo com os comentários, aqui está um conjunto de dados de exemplo:
CREATE TABLE #example
(
Server NVARCHAR(255) NOT NULL
,[Database] NVARCHAR(255) NOT NULL
,[Schema] NVARCHAR(255) NOT NULL
,[Table] NVARCHAR(255) NOT NULL
,Field1 INT
,Field2 DATE
,Field3 VARCHAR(50)
)
INSERT INTO #example
(Server,[Database],[Schema],[Table],Field1,Field2,Field3)
VALUES ('LinkedServer','DB','dbo','TableA',15,CONVERT(DATE,'1-1-18'),'Text')
Então, se eu quisesse selecionar a referência da primeira linha, imagino que faria algo como:
DECLARE @SERVER ??, @DB ??, @SCHEMA ??, @TABLE ??
SELECT TOP 1 @SERVER = Server FROM #example
SELECT TOP 1 @DB = [Database] FROM #example
SELECT TOP 1 @SCHEMA = [Schema] FROM #example
SELECT TOP 1 @TABLE = [Table] FROM #example
SELECT * FROM
@SERVER.@DB.@SCHEMA.@TABLE
WHERE
Field1 = (SELECT TOP 1 Field1 FROM #example)
AND Field2 = (SELECT TOP 1 Field2 FROM #example)
AND Field3 = (SELECT TOP 1 Field3 FROM #example)
O que você está procurando fazer é chamado de SQL dinâmico .
Usando seu exemplo, acho que você quer fazer algo assim:
Observe algumas coisas:
Estou usando QUOTENAME para escapar de objetos que não posso parametrizar -- o servidor, banco de dados, esquema e nomes de tabela.
Estou usando sp_executesql para parametrizar o que posso, para evitar injeção de SQL.
Vou linká-lo novamente, porque é uma coisa muito importante para ler: A maldição e bênçãos do SQL dinâmico