有时我最终会遇到这样的情况:我有一个字符串版本的对象引用,如下所示:
'server.database.schema.table'
我需要将它用作实际对象引用:
'server.database.schema.table'+'.'+[column]
我如何将该字符串转换为:
[server].[database].[schema].[table]
所以我真的可以使用它吗?
我确定以前有人问过这个问题,而且可能是新问题,但我就是找不到合适的关键字。我没有在 EXEC EXECUTE 中使用它。
根据评论,这是一个示例数据集:
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')
所以,如果我想选择第一行的引用,我想我会做类似的事情:
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)
您要执行的操作称为dynamic SQL。
使用你的例子,我想你想做这样的事情:
请注意以下几点:
我正在使用QUOTENAME来转义我无法参数化的对象——服务器、数据库、模式和表名称。
我正在使用sp_executesql来参数化我所能做的,以防止 SQL 注入。
我会再次链接到它,因为阅读它真的很重要:The Curse and Blessings of Dynamic SQL