使用 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];'''
删除它,它应该可以工作。
我需要删除并重新创建 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];'''
删除它,它应该可以工作。