2016-05-23 7 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

ありがとうございました。実行可能な部分を実行すると、変換 '%'のエラーが返されます。それはもうそれの一部ではないので意味を成しません。奇妙な。回避策はありますか?他に何かが起こっていない限り。エラーはOrder by節である26行目です。 – vbnewbie

+0

新しいコードを投稿する – StackUser

+0

私のせいで申し訳ありません。私は実行可能な呼び出しでタイプミスがありました。謝罪いたします。実行されましたが、テーブルの1つに「無効なオブジェクト名」があります。それはテーブル名の後にアンダースコアを持っていないようだ。それは長く実行されます。このように見える - 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

関連する問題