2

SQL ファイルで SQL スクリプトの一括セットを使用し、実行時にそのファイルを C# のテキスト変数にロードします。したがって、Oledb 接続とコマンド タイプを「テキスト」として次のクエリを実行します。残念ながら、次のエラーが発生しました。

Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
Incorrect syntax near 'GO'.

SQL クエリ構文

  IF exists  (
                SELECT  '1' 
                FROM    sysobjects 
                WHERE   id = object_id(N'SP_Name')  
                and     objectproperty(id, N'isprocedure') = 1
               )
    BEGIN
        DROP PROC SP_Name 
    END
    GO
    Create PROCEDURE SP_Name 
     (  
       @var_id NUMERIC(10),
       @var_id1 NVARCHAR(100),
       @var_id_Out1     numeric(10)     output,
       @var_id_Out2     integer         output,
       @var_id_Out3     nvarchar(2000)  output
    )  
    WITH ENCRYPTION  
    AS  
    BEGIN  
    SET NOCOUNT ON  
        select * from demotable
    SET NOCOUNT OFF  
    END 
    GO

GRANT   EXEC ON SP_Name TO PUBLIC
GO

C# コード スニペット

OleDbCommand cmd;
OleDbConnection co = new OleDbConnection("Provider=SQLOLEDB;Data Source=servername;Database=DB_Name;User Id=sa;Password=mypass;");
co.Open();
String[] strFileList = Directory.GetFiles(@"D:\Procedure");
String conntent = null;
foreach (string commandSP in strFileList)
{
       conntent = File.ReadAllText(commandSP);
       cmd = co.CreateCommand();
       cmd.CommandText = conntent;     
       cmd.ExecuteNonQuery();
}
co.Close();
4

2 に答える 2

2

GOコマンドはT-SQL構文です...フロントエンドによって解釈されてバッチを分離します...OLEDBもサーバーもそのステートメントを理解できません...

これをOLEDBで動作させるには、バッチを自分で分割し、各バッチを個別に実行できます

于 2013-04-11T06:12:32.337 に答える
2

GO は T-SQL キーワードではありません。つまり、言語の一部ではありません。一部のクライアント (Management Studio など) がバッチを分離するために使用する単なるトークンです。

于 2013-04-11T06:14:12.803 に答える