C# 单击一次运行两条SQL语句

C# 单击一次运行两条SQL语句,c#,sql,sql-server,C#,Sql,Sql Server,我有一个非常简单的应用程序,只有一个按钮。当用户单击该按钮时,它将运行5-6条SQL语句。但它给出了如下错误。如果我在sql Management Studio上运行sql,那么它运行时不会出现问题。但是如果我用c运行它,它会给出错误 我怎样才能解决这个问题 这是我的sql代码。我在每一句话之间加了一个中间词 CREATE PROCEDURE [dbo].[AGIRLIK] @DONEMREF int AS DECLARE @LOGICALREF

我有一个非常简单的应用程序,只有一个按钮。当用户单击该按钮时,它将运行5-6条SQL语句。但它给出了如下错误。如果我在sql Management Studio上运行sql,那么它运行时不会出现问题。但是如果我用c运行它,它会给出错误

我怎样才能解决这个问题

这是我的sql代码。我在每一句话之间加了一个中间词

        CREATE PROCEDURE [dbo].[AGIRLIK]
    @DONEMREF int
    AS
    DECLARE
    @LOGICALREF  INT,
    @EXPCENTERREF  INT,
    @POSTEDPRDREF INT,
    @OVHDCLNREF INT,
    @TOTAL FLOAT
    DECLARE C_CURSOR CURSOR FOR
    SELECT D.LOGICALREF,D.POSTEDPRDREF  ,D.EXPCENTERREF ,D.OVHDCLNREF  ,SUM(OT.TOTAL)
    FROM LG_001_ACTOVRHDDIST  D 
    INNER JOIN LG_001_OVHDTRANS as ot 
    ON D.OVHDCLNREF=OT.OVHDCLNREF 
    WHERE D.POSTEDPRDREF=@DONEMREF
    GROUP BY D.LOGICALREF,D.POSTEDPRDREF  ,D.EXPCENTERREF ,D.OVHDCLNREF
    OPEN C_CURSOR
       FETCH NEXT FROM C_CURSOR
    INTO @LOGICALREF ,@POSTEDPRDREF ,@EXPCENTERREF ,@OVHDCLNREF,@TOTAL
        WHILE @@FETCH_STATUS = 0
      BEGIN
                UPDATE LG_001_ACTOVRHDDIST
                SET TOTAL=@TOTAL
                WHERE POSTEDPRDREF=@DONEMREF
                AND POSTEDPRDREF=@POSTEDPRDREF
                AND EXPCENTERREF=@EXPCENTERREF 
                AND OVHDCLNREF=@OVHDCLNREF

    FETCH NEXT FROM C_CURSOR
    INTO  @LOGICALREF ,@POSTEDPRDREF ,@EXPCENTERREF ,@OVHDCLNREF,@TOTAL
    END
    CLOSE C_CURSOR
    DEALLOCATE C_CURSOR


    GO 

    ALTER VIEW LS_AGIRLIK_DAGILIM
    AS
    SELECT LOGICALREF [REF],
    FICHENO [URETIM_EMRI_NO],
    DATE_ [URETIM_EMRI_TARIHI],
    (SELECT CODE FROM LG_001_ROUTING WHERE P.ROUTINGREF=LOGICALREF) [ROTA_KODU],
    (SELECT NAME FROM LG_001_ROUTING WHERE P.ROUTINGREF=LOGICALREF) [ROTA_ADI],
    (SELECT CODE FROM LG_001_ITEMS WHERE P.ITEMREF=LOGICALREF) [STOK_KODU],
    (SELECT NAME FROM LG_001_ITEMS WHERE P.ITEMREF=LOGICALREF) [STOK_ADI],
    CAST ((SELECT WEIGHT  FROM LG_001_ITMUNITA where ITEMREF=P.ITEMREF) AS FLOAT) [GR_MT],
    (CAST ((SELECT WEIGHT  FROM LG_001_ITMUNITA where ITEMREF=P.ITEMREF) AS FLOAT))*ACTAMOUNT [AGIRLIK],

    ACTAMOUNT [GERCEKLESEN_MIKTAR],
    (CASE STATUS 
        WHEN 0 THEN 'BASLAMADI'
    WHEN 1 THEN 'DEVAM_EDIYOR'
    WHEN 3 THEN 'TAMAMLANDI'
    WHEN 4 THEN 'KAPANDI'
    END)
    [DURUMU],
    ACTMATERIALCOST [GERCEKLESEN_MALZEME_MALIYETI],
    ACTOVERHCOST [GERCEKLESEN_GENEL_GIDER_PAYI],
    ACTTOTALCOST [GERCEKLESEN_TOPLAM_MALIYET] 

    FROM LG_001_PRODORD P WHERE CANCELLED=0 AND STATUS<>0 AND 
    ROUTINGREF NOT IN (SELECT LOGICALREF FROM LG_001_ROUTING WHERE CODE LIKE 'B%')
    AND SPECODE<>'MONTAJ'
    AND DATE_ BETWEEN '2014-02-06' AND '2014-02-13'

    GO 
    ----------------------------

    ALTER VIEW DBO.[LS_CARPAN]
    AS
    SELECT 
    REF,
    AGIRLIK/(SELECT SUM(AGIRLIK) FROM LS_AGIRLIK_DAGILIM) [YUZDE]
    FROM LS_AGIRLIK_DAGILIM

    GO 
    ----------------------------
使用[数据库名称]
必须在脚本的第一行指定。

GO是Management Studio理解的批处理分隔符,sqlcmd不是TSQL命令。您也需要在C代码中使用它作为批之间的分隔符。我明白,但我应该使用什么?您面临什么错误?我不认为它是重复的。我不是在问如何使用GO。我在问应该用什么替换GO?当然,假设客户端上安装了sqlcmd。
string sPath = @"D:\script.sql";
if (File.Exists(sPath) == false)
    return;
string sServer = "SQL SERVER INSTANCE NAME";
string sUserID = "sa";
string sPassword = "password"; 

Process p = new Process();
p.StartInfo.UseShellExecute = false;                        
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = "sqlcmd";
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

if (sPassword == "")
    p.StartInfo.Arguments = string.Format("-S {0} -i {1} ", sServer, sPath);
else
    p.StartInfo.Arguments = string.Format("-S {0} -U {1} -P {2} -i " + Convert.ToChar(34) + "{3}" + Convert.ToChar(34), sServer, sUserID, sPassword, sPath);

bool started = p.Start();

string output = p.StandardOutput.ReadToEnd();

p.WaitForExit();