Sql-Server

將字元串轉換為對象引用

  • October 21, 2018

有時我最終會處於這樣一個位置,即我有一個對象引用的字元串版本,如下所示:

'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)

您要執行的操作稱為動態 SQL

使用您的範例,我認為您想做這樣的事情:

DECLARE @SERVER sysname, 
       @DB sysname, @SCHEMA sysname, 
       @TABLE sysname,
       @FIELD1 INT,
       @FIELD2 DATE,
       @FIELD3 VARCHAR(50);

SELECT TOP 1 @SERVER = Server,
            @DB = [Database], 
            @SCHEMA = [Schema],
            @TABLE = [Table],
            @FIELD1 = Field1,
            @FIELD2 = Field2,
            @FIELD3 = Field3
FROM #example
--ORDER BY Server
--You need to order by a unique column or set of columns to make this determinstic

DECLARE @StringToExecute NVARCHAR(MAX) = N''

SET @StringToExecute += N'
SELECT * 
FROM ' 
   + QUOTENAME(@SERVER)
   + N'.'
   + QUOTENAME(@DB)
   + N'.'
   + QUOTENAME(@SCHEMA)
   + N'.'
   + QUOTENAME(@TABLE) 
   + N'
WHERE 
   Field1 = @sp_FIELD1
   AND Field2 = @sp_FIELD2
   AND Field3 = @sp_FIELD3
';

PRINT @StringToExecute;

EXEC sys.sp_executesql @StringToExecute, 
                      N'@sp_FIELD1 INT, @sp_FIELD2 DATE, @sp_FIELD3 VARCHAR(50)',
                      @sp_FIELD1 = @FIELD1, @sp_FIELD2 = @FIELD2, @sp_FIELD3 = @FIELD3;

注意幾件事:

  • 我正在使用QUOTENAME來轉義我無法參數化的對象——伺服器、數據庫、模式和表名。
  • 我正在使用sp_executesql來參數化我所能做的,以防止 SQL 注入。

我將再次連結到它,因為它是非常重要的閱讀內容:動態 SQL 的詛咒和祝福

引用自:https://dba.stackexchange.com/questions/220594