Sql-Server
將字元串轉換為對象引用
有時我最終會處於這樣一個位置,即我有一個對象引用的字元串版本,如下所示:
'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 的詛咒和祝福