2015-10-05 48 views
0

如何防止這種錯誤SQL SERVER如何避免外塊的存儲過程中的第一次運行

「OLE DB提供程序‘MSDASQL’爲鏈接服務器返回消息 」 [Teradata數據] [ODBC Teradata數據驅動程序] [Teradata數據庫]對象 「teradataDB.tablename」不存在「。

我使用OPENQUERY來檢查Teradata表是否存在,如果存在,刪除表和選擇重新創建表。我使用openquery將Teradata表中的數據插入到sql服務器表中。 然而,當我運行存儲過程時,它給了我上面的錯誤,因爲它執行插入並且先在最後兩行選擇。我如何修改它以先運行第一個塊,然後運行最後兩行?

DECLARE @strSql NVARCHAR(MAX) = '' 
DECLARE @TableName NVARCHAR(50) 
DECLARE @linkedServer NVARCHAR(50) 
DECLARE @TabExists BIT 

DECLARE TableCursor CURSOR LOCAL FOR 
SELECT TABLENAME FROM #TableList 

OPEN TableCursor 
FETCH NEXT FROM TableCursor INTO @TableName 

WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @strSql='Select count(1) as TabExists FROM DBC.TABLES WHERE TABLEKIND=''T'' AND DATABASENAME=''teradataDB'' AND TABLENAME=''' [email protected]+ '''' 
SET @strSql = N'select @TabExists=TabExists from OPENQUERY('[email protected]+', ''' + REPLACE(@strSql, '''', '''''') + ''')' 
EXEC sp_executesql @strSql, N'@TabExists BIT OUT', @TabExists OUT; 


FETCH NEXT FROM TableCursor INTO @TableName 

IF (@TableName ='tablename') 
BEGIN 
    IF (@TableName ='tablename') AND (@TabExists = 1) 
    BEGIN 
     EXEC sp_executesql 
     N' 
     EXEC (
      ''DROP TABLE teradataDB.tablename'') AT [linkedserver];' 
    END 

    EXEC sp_executesql 
    N' 
    EXEC (
     ''CREATE TABLE AS SELECT (
         ~~~~ 
        ) 
     '') AT [linkedserver];' 


END 

END 
CLOSE TableCursor 
DEALLOCATE TableCursor 

INSERT INTO sqlServerDB.tablename 
SELECT * FROM OPENQUERY (linkedserver, 'SELECT columns FROM teradataDB.tablename') 

回答

0

而不是上面的代碼與CURSOR,您可以使用相同的以下代碼。

IF (EXISTS (SELECT * 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE TABLE_SCHEMA = 'TheSchema' 
       AND TABLE_NAME = 'TheTable')) 
BEGIN 
    DROP TABLE teradataDB.tablename 
END 

現在你不需要創建表的結構,並觸發以下查詢。

INSERT INTO sqlServerDB.tablename 
SELECT * FROM OPENQUERY (linkedserver, 'SELECT columns FROM teradataDB.tablename') 
相關問題