2016-05-23 82 views
-1

我有這個代碼塊,我不知道如何解決錯誤,當我執行它。預計存儲過程參數錯誤

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Dan_IPro_to_II]') AND type in (N'P', N'PK')) 
    DROP PROCEDURE [dbo].[Dan_IPro_to_II] 
GO 

CREATE PROCEDURE Dan_IPro_to_II 
    @ipro_db SYSNAME, 
    @ipro_setid int, 
    @II_setid int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @table_name SYSNAME 
    Declare @table_part VARCHAR(30) 
    Declare @db SYSNAME 

    DECLARE comp_cursor CURRSOR FOR 
     SELECT TABLE_NAME 
     FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_TYPE = 'BASE TABLE' 
     AND TABLE_NAME LIKE '%' + @ipro_setID + '' 
     ORDER BY TABLE_NAME 

    OPEN COMP_CURSOR 

    FETCH NEXT FROM COMP_CURSOR INTO @table_name 

    SET @table_part = 'IPro_' + replace(@table_name,'_' + @ipro_setID,'') 

    WHILE (@@fetch_status = 0 and @@error = 0) 
    BEGIN 
     print 'Copying ' + @table_name 

     EXEC ('if exists (select Table_Name from information_schema.tables where table_name = ''' + @table_part + ''') DROP TABLE ' + @table_part) 
     EXEC ('select * into ' + @table_part + ' FROM [' + @ipro_db + '].[dbo].' + @table_name ) 

     FETCH NEXT FROM COMP_CURSOR INTO @table_name 
    END 

    print 'Completed Ipro Transfer ' [email protected] 

    CLOSE COMP_CURSOR 
    DEALLOCATE COMP_CURSOR 
END 
GO 

這是我的錯誤,當我執行存儲過程:

消息201,級別16,狀態4,過程Dan_IPro_to_II,行0
過程或函數 'Dan_IPro_to_II' 預計參數'@ipro_db',沒有提供。

我需要告訴它在哪裏可以找到@Ipro_db,我想?我會在哪裏放?在存儲過程的執行語句中?

感謝您的幫助。

我試着將它們導入或導出數據,但他們沒有任何人知道如何做到這一點。他們想這樣。

再次感謝您的幫助。

VBNewbie。

+0

你是如何調用這個程序?有3個入站參數。你提供他們嗎? –

+0

SQL Server Management Studio中內置了一個導出/導入嚮導,與遊標中的動態SQL相比,它更易於使用。該錯誤消息表明您正在執行該過程並且未指定正確的參數。你如何執行存儲過程? – mheptinstall

+0

是的,我知道有一個導出/導入功能。有人不知道它,我試圖讓他們這樣做。我不確定要傳遞什麼參數。我看到哪些代碼需要調用,但不知道要在可執行文件中傳遞什麼。我認爲@Ipro_db = ipro數據庫。這樣正確嗎?我沒有寫代碼。別人做了。我修改了我發現並部分理解要做什麼。我用於導入/導出功能。抱歉不能比這更有幫助。 – vbnewbie

回答

0

嘗試這樣,我已經改變了你的代碼中的一些東西。將轉換函數包含到Int參數中。關鍵字光標拼寫錯誤。

IF EXISTS (
     SELECT * 
     FROM sys.objects 
     WHERE object_id = OBJECT_ID(N'[dbo].[Dan_IPro_to_II]') 
      AND type IN (
       N'P' 
       ,N'PK' 
       ) 
     ) 
    DROP PROCEDURE [dbo].[Dan_IPro_to_II] 
GO 

CREATE PROCEDURE Dan_IPro_to_II @ipro_db SYSNAME 
    ,@ipro_setid INT 
    ,@II_setid INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @table_name SYSNAME 
    DECLARE @table_part VARCHAR(30) 
    DECLARE @db SYSNAME 

    DECLARE comp_cursor CURSOR 
    FOR 
    SELECT TABLE_NAME 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE' 
    --AND TABLE_NAME LIKE '%' + CONVERT(VARCHAR(10),@ipro_setID) + '' 
    ORDER BY TABLE_NAME 

    OPEN COMP_CURSOR 

    FETCH NEXT 
    FROM COMP_CURSOR 
    INTO @table_name 

    SET @table_part = 'IPro_' + replace(@table_name, '_' + CONVERT(VARCHAR(10), @ipro_setID), '') 

    WHILE (
      @@fetch_status = 0 
      AND @@error = 0 
      ) 
    BEGIN 
     PRINT 'Copying ' + @table_name 

     EXEC ('if exists (select Table_Name from information_schema.tables where table_name = ''' + @table_part + ''') DROP TABLE ' + @table_part) 

     EXEC ('select * into ' + @table_part + ' FROM [' + @ipro_db + '].[dbo].' + @table_name) 

     FETCH NEXT 
     FROM COMP_CURSOR 
     INTO @table_name 
    END 

    PRINT 'Completed Ipro Transfer ' + @db 

    CLOSE COMP_CURSOR 

    DEALLOCATE COMP_CURSOR 
END 
GO 

--Sample Procedure Call 
EXEC Dan_IPro_to_II @ipro_db='SampleDB' 
    ,@ipro_setid='1' 
    ,@II_setid='1001' 
+0

謝謝你的幫助。當我運行可執行部分時,我在轉換'%'上找回錯誤。這是沒有道理的,因爲它不再是它的一部分。奇怪的。有什麼建議解決?除非發生其他事情。錯誤表示第26行是Order by子句。 – vbnewbie

+0

發佈您的新密碼讓我支票 – StackUser

+0

對不起我的錯。我的可執行調用中有一個錯字。我很抱歉。它確實運行了,但是其中一個表得到了「無效的對象名稱」。似乎它沒有在表名之後有下劃線。所以它運行很長。看起來像這樣 - Ipro_AG_RT604190666。 – vbnewbie

0

下面是我解決這個問題的方法。感謝@StackNewUser幫助解決這個問題。

USE [ImpactPro90]
BEGIN SET NOCOUNT ON;

DECLARE @table_name SYSNAME 
DECLARE @table_part SYSNAME 

DECLARE comp_cursor cursor FOR 
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE' 
    AND TABLE_NAME LIKE '%_1604220600' 
ORDER BY TABLE_NAME 

OPEN COMP_CURSOR 

FETCH NEXT FROM COMP_CURSOR INTO @table_name 
    SET @table_part = 'IPro_' + @table_name 
    WHILE (@@fetch_status = 0 and @@error = 0) 
BEGIN 
    PRINT'Copying table ' + @table_name 
    EXEC ('select * into ' +'[II_to_IIRP].[dbo].' + @table_name + ' FROM [ImpactPro90].[dbo].' + @table_name ) 
    PRINT 'Done copying ' + @table_name 
    FETCH NEXT FROM COMP_CURSOR INTO @table_name 
    PRINT 'Getting next table ' + @table_name 

END CLOSE COMP_CURSOR DEALLOCATE COMP_CURSOR END