使用 LinkedServer 来自 SQL 服务器的 EDW 上的 DDL 和 DML 不起作用

DDL and DML on EDW from SQL Server using LinkedServer does not work

我需要删除并重新创建 table 并从 SQL 服务器插入 EDW 环境。从下面的 "PRINT @DropTable" 中,我得到了结果:

 N'EXEC (''DROP TABLE dbname.tablename;'') AT [linkedserver];'

如果我 运行 手动:

EXEC sp_executesql N'EXEC (''DROP TABLE dbname.tablename;'') AT [linkedserver];'

,有效。但是当我 运行

EXEC sp_executesql @DropTable

,它给了我错误:

N'EXEC (''DROP TABLE dbname.tablename;'') AT [linkedserver];' Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'EXEC ('DROP TABLE dbname.tablename;') AT [linkedserver];'.

这是我的代码:

DECLARE @TableName VARCHAR(25)
DECLARE @TDQuery NVARCHAR(MAX)
DECLARE @OpenQry NVARCHAR(MAX)
DECLARE @TableToDrop VARCHAR(25)
DECLARE @DropTable NVARCHAR(MAX)
DECLARE @DropTableSQL NVARCHAR(MAX)
DECLARE @linkedServer VARCHAR(50)
DECLARE @linkedDbName VARCHAR(50)
DECLARE @TabExists BIT

DECLARE CUR_QRY CURSOR FOR
SELECT TableName, TDQuery FROM dbo.tbl_TABLE

OPEN CUR_QRY
FETCH NEXT FROM CUR_QRY INTO @TableName, @TDQuery

WHILE @@FETCH_STATUS = 0 
BEGIN

SET  @linkedServer='linkedserver'
SET @linkedDbName='dbname'
SET @OpenQry='Select count(1) as TabExists FROM DBC.TABLES WHERE TABLEKIND=''T'' AND DATABASENAME=''dbname'' AND TABLENAME=''' +@TableName+ ''''
SET @OpenQry = N'select @TabExists = CASE WHEN TabExists = 0 THEN 0 ELSE 1 END from OPENQUERY('+@linkedServer+', ''' + REPLACE(@OpenQry, '''', '''''') + ''')'
EXEC sp_executesql @OpenQry, N'@TabExists BIT OUT', @TabExists OUT;

PRINT @TabExists
IF @TabExists = 1 

PRINT @TableName
SET @DropTableSQL = N'''''DROP TABLE dbname.'+ @TableName+';''''';

PRINT @DropTableSQL

SELECT @DropTable = 'N'''+ N'EXEC (' + @DropTableSQL + N') AT [linkedserver];'''

PRINT @DropTable

EXEC sp_executesql @DropTable

FETCH NEXT FROM CUR_QRY INTO @TableName, @TDQuery
END
CLOSE CUR_QRY
DEALLOCATE CUR_QRY

变量@DropTable本身是NVARCHAR(MAX)类型所以不需要第一个N in:

SELECT @DropTable = 'N'''+ N'EXEC (' + @DropTableSQL + N') AT [linkedserver];'''

删除它,它应该可以工作。