C# .NET - Creating stored procedure from C# code

Asked By Aldo Liaks on 02-Oct-08 04:49 AM

Guys, I don't understand where the problem is...

If I run the query directly on SLQ Server Studio it DOES WORK.

If I take a simplified version of the query, like below it DOES WORK too:

+ @" if not exists(Select * from sysobjects where name = 'ON_TIME_DELIVERY_TELCON2006_20081002000') "

+ @" begin "

+ @" EXEC dbo.sp_executesql @statement = N' "

+ @" CREATE PROCEDURE ON_TIME_DELIVERY_TELCON2006_20081002000 "

+ @" @FirstDate varchar(25), "

+ @" @LastDate varchar(25) "

+ @" AS "

+ @" SELECT * FROM ACCOUNTS "

+ @" 'end "

+ @"";

 

But if I try to run it from C# code (with the original query that works on SQL Studio) I get the Error: "Error: Line1: Incorrect syntax near ')'."

What's going on here?!

Thanks in advance for any help.


Below the code:

#region OTD (On time delivery) Report as Stored Procedure in MS SQL Server

string otdStoredProc = ""

+ @" if not exists(Select * from sysobjects where name = 'ON_TIME_DELIVERY_TELCON2006_20081002000') "

+ @" begin "

+ @" EXEC dbo.sp_executesql @statement = N' "

+ @" CREATE PROCEDURE ON_TIME_DELIVERY_TELCON2006_20081002000 "

+ @" @FirstDate varchar(25), "

+ @" @LastDate varchar(25) "

+ @" AS "

+ @" SELECT * FROM "

+ @" ( "

+ @" SELECT DISTINCT "

+ @" GROUPING([ID]) AS grp, "

+ @" CASE WHEN GROUPING([Accounts.FULLNAME]) = 1 THEN ''...Sub Total'' ELSE [Accounts.FULLNAME] END AS ''Accounts.FullName'', "

+ @" Sum([WorkOrders]) AS ''WorkOrders'', "

+ @" Sum([WO_FromStock]) AS ''WO_FromStock'', "

+ @" Sum([WO_ToManuf]) AS ''WO_ToManuf'', "

+ @" Sum([Early]) AS ''Early'', "

+ @" Sum([OnTime]) AS ''OnTime'', "

+ @" Sum([1Week]) AS ''1Week'', "

+ @" Sum([2Weeks]) AS ''2Weeks'', "

+ @" Sum([1Month]) AS ''1Month'', "

+ @" Sum([OverMonth]) AS ''OverMonth'', "

+ @" CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([Early]) as real) / Sum([WO_ToManuf]) ELSE 0 END AS ''%Early'', "

+ @" CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([OnTime]) as real) / Sum([WO_ToManuf]) ELSE 0 END AS ''%OnTime'', "

+ @" CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([1Week]) as real) / Sum([WO_ToManuf]) ELSE 0.00 END AS ''%1Week'', "

+ @" CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([2Weeks]) as real) / Sum([WO_ToManuf]) ELSE 0.00 END AS ''%2Weeks'', "

+ @" CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([1Month]) as real) / Sum([WO_ToManuf]) ELSE 0.00 END AS ''%1Month'', "

+ @" CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([OverMonth]) as real) / Sum([WO_ToManuf]) ELSE 0.00 END AS ''%OverMonth'', "

+ @" CASE WHEN Sum([WO_ToManuf]) > 0 THEN (Cast(Sum([Early]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([OnTime]) as real) / Sum([WO_ToManuf])) ELSE 0 END AS ''%OTD'', "

+ @" CASE WHEN Sum([WO_ToManuf]) > 0 THEN (Cast(Sum([1Week]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([2Weeks]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([1Month]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([OverMonth]) as real) / Sum([WO_ToManuf])) ELSE 0.00 END AS ''%PassDue'', "

+ @" CASE WHEN Sum([WO_ToManuf]) > 0 THEN (Cast(Sum([Early]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([OnTime]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([1Week]) as real) / Sum([WO_ToManuf])) ELSE 0 END AS ''%SupplyGrade'' "

+ @" FROM "

+ @" ( "

+ @" SELECT "

+ @" 1 AS ''ID'', "

+ @" Accounts.FULLNAME AS ''Accounts.FullName'', "

+ @" CASE WHEN StockMoves.DETAILS is not Null THEN 1 ELSE 0 END AS ''WorkOrders'', "

+ @" CASE WHEN StockMoves.REFERENCE = 0 THEN 1 ELSE 0 END AS ''WO_FromStock'', "

+ @" CASE WHEN StockMoves.REFERENCE <> 0 THEN 1 ELSE 0 END AS ''WO_ToManuf'', "

+ @" CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) < 0 THEN 1 ELSE 0 END AS ''Early'', "

+ @" CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) = 0 THEN 1 ELSE 0 END AS ''OnTime'', "

+ @" CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) BETWEEN 1 AND 7 THEN 1 ELSE 0 END AS ''1Week'', "

+ @" CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) BETWEEN 8 AND 14 THEN 1 ELSE 0 END AS ''2Weeks'', "

+ @" CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) BETWEEN 15 AND 30 THEN 1 ELSE 0 END AS ''1Month'', "

+ @" CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) > 30 THEN 1 ELSE 0 END AS ''OverMonth'' "

+ @" FROM ITEMS AS Items "

+ @" INNER JOIN STOCKMOVES AS StockMoves "

+ @" INNER JOIN STOCK AS Stock ON StockMoves.STOCKID = Stock.ID "

+ @" INNER JOIN DOCUMENTSDEF AS DocumentsDef ON StockMoves.DOCUMENTID = DocumentsDef.DOCUMENTID "

+ @" INNER JOIN ACCOUNTS AS Accounts ON Stock.ACCOUNTKEY = Accounts.ACCOUNTKEY ON Items.ITEMKEY = StockMoves.ITEMKEY "

+ @" LEFT JOIN StockMoves AS StockMoves2 ON StockMoves.DETAILS = StockMoves2.DETAILS AND StockMoves2.DOCUMENTID In (6, 36) "

+ @" WHERE "

+ @" Accounts.SORTGROUP Between 3000 And 3999 "

+ @" AND Accounts.FILTER Not In (''‰‚…ƒ'',''€Žƒ‰ˆ'') "

+ @" AND Accounts.ACCOUNTKEY Between '''' And ''šššššššššššššššššššš'' "

+ @" AND Items.SORTGROUP Between 50 And 99 "

+ @" AND Items.ITEMKEY Between '''' And ''šššššššššššššššššššš'' "

+ @" AND Items.ITEMKEY Not In (''ZI'',''ZP'',''*'',''.'',''@'',''#'') "

+ @" AND Stock.VALUEDATE BETWEEN convert(datetime, @FirstDate, 121) AND convert(datetime, @LastDate, 121) "

+ @" AND StockMoves.DOCUMENTID In (1, 2, 35) "

+ @" -- Erase the line below after testing "

+ @" -- AND Accounts.ACCOUNTKEY In (''301501002'', ''301505009'', ''301503003'', ''301517014'', ''301519001'') "

+ @" ) AS A "

+ @" GROUP BY "

+ @" [ID], "

+ @" [Accounts.FULLNAME] "

+ @" WITH ROLLUP "

+ @" ) AS B "

+ @" WHERE "

+ @" grp = 0 AND [WO_ToManuf] > 0 "

+ @" -- EXEC ON_TIME_DELIVERY_TELCON2006_20081002000 "

+ @" -- @FirstDate = ''2026-08-01 00:00:00.000'', "

+ @" -- @LastDate = ''2025-08-31 00:00:00.000'' "

+ @" 'end "

+ @"";

#endregion


private void PopulateOTDReportAsStoredProc()

{

// Declare Database name

string dbName = " ";

string conn = @"server=;uid=;pwd=;database=" + dbName;

try

{

using (SqlConnection myConnection = new SqlConnection(conn))

{

using (SqlCommand sqlComm = new SqlCommand())

{

myConnection.Open();

sqlComm.Connection = myConnection;

// Select the database.

sqlComm.CommandText = "USE " + dbName;

sqlComm.ExecuteNonQuery();

// Create sp (If Stored Procedure doesn't exists).

sqlComm.CommandText = otdStoredProc;

sqlComm.ExecuteNonQuery(); //Here I get the EXCEPTION

// Execute sp.

sqlComm.CommandText =

" EXEC ON_TIME_DELIVERY_TELCON2006_20081002000 " +

" @FirstDate = " + "'" + dtFirstDate.Value.ToString("yyyy/MM/dd 00:00:00.000") + "'" + ", " +

" @LastDate = " + "'" + dtLastDate.Value.ToString("yyyy/MM/dd 00:00:00.000") + "'" +

"";

//sqlComm.CommandText = "EXEC ON_TIME_DELIVERY_TELCON2006 '2026-08-01 00:00:00.000', '2025-08-31 00:00:00.000'";

sqlComm.ExecuteNonQuery();

using (SqlDataAdapter da = new SqlDataAdapter(sqlComm))

{

//DataSet dsOTD = new DataSet();

da.Fill(dsOTD);

//dgv1.DataSource = dsOTD.Tables[0];

}

myConnection.Close();

}

}

}

catch (Exception ex)

{

MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

System.Windows.Forms.Application.Exit(); // finish the program

}

}

solution

Perry replied to Aldo Liaks on 02-Oct-08 05:05 AM
Hi,

In C# @ having the special meaning. I could see that you are adding @ before "..." string that is Ok but @ is there inside the string also see below

@" EXEC dbo.sp_executesql @statement = N' " and some others lines as well.

You will need to hide the meaning of the @ inside the string like below

@" EXEC dbo.sp_executesql \@statement = N' "

So put '\' before all the @ but remember only @s which are inside the string.

Regards,
Megha

still error

Aldo Liaks replied to Perry on 02-Oct-08 05:33 AM

Hi Megha,

After changing to:

+ @" if not exists(Select * from sysobjects where name = 'ON_TIME_DELIVERY_TELCON2006_20081002000') "

+ @" begin "

+ @" EXEC dbo.sp_executesql \@statement = N' "

+ @" CREATE PROCEDURE ON_TIME_DELIVERY_TELCON2006_20081002000 "

I get: ERROR: Line1: Incorrect syntax near "\".

reply

Perry replied to Aldo Liaks on 02-Oct-08 05:37 AM
@" EXEC dbo.sp_executesql \@statement = N' " ==> extra unmatch single qoute is there after N

Megha
?
Aldo Liaks replied to Perry on 02-Oct-08 05:50 AM

but the single quote is to indicate the string "CREATE..."

The match to that single quote is before the "end".

+ @" if not exists(Select * from sysobjects where name = 'ON_TIME_DELIVERY_TELCON2006_20081002000') "

+ @" begin "

+ @" EXEC dbo.sp_executesql \@statement = N' "

+ @" CREATE PROCEDURE ON_TIME_DELIVERY_TELCON2006_20081002000 "

+ @" 'end "

+ @"";

reply
Perry replied to Aldo Liaks on 02-Oct-08 05:53 AM
make it like below by combine all those sentances and also put '\' befor single qoute also

@" EXEC dbo.sp_executesql \@statement = N\CREATE PROCEDURE ON_TIME_DELIVERY_TELCON2006_20081002000 \'end"

+ @"";

.

.

Regards,
Megha
SOLVED!
Aldo Liaks replied to Perry on 02-Oct-08 08:20 AM

I don't know what the problem was, but for now it seem to be working okay.

What I did is recreating the query line by line and checking step by step.

Thanks for all the help.

Aldo.

        string otdStoredProc = ""

            + " if not exists(Select * from sysobjects where name = 'Condor_Telcon2006_ON_TIME_DELIVERY_20081002000') "

            + " begin "

            + " EXEC dbo.sp_executesql @statement = N' "

            + " CREATE PROCEDURE Condor_Telcon2006_ON_TIME_DELIVERY_20081002000 "

            + " @FirstDate varchar(25), "

            + " @LastDate varchar(25) "

            + " AS "

            + " SELECT * FROM "

            + "   ( "

            + "       SELECT DISTINCT "

            + "         GROUPING([ID]) AS ''grp'', "

            + "         CASE WHEN GROUPING([Accounts.FULLNAME]) = 1 THEN ''...Sub Total'' ELSE [Accounts.FULLNAME] END AS ''Accounts.FullName'', "

            + "         Sum([WorkOrders]) AS ''WorkOrders'', "

            + "         Sum([WO_FromStock]) AS ''WO_FromStock'', "

            + "         Sum([WO_ToManuf]) AS ''WO_ToManuf'', "

            + "         Sum([Early]) AS ''Early'', "

            + "         Sum([OnTime]) AS ''OnTime'', "

            + "         Sum([1Week]) AS ''1Week'', "

            + "         Sum([2Weeks]) AS ''2Weeks'', "

            + "         Sum([1Month]) AS ''1Month'', "

            + "         Sum([OverMonth]) AS ''OverMonth'', "

            + "         CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([Early]) as real) / Sum([WO_ToManuf]) ELSE 0 END AS ''%Early'', "

            + "         CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([OnTime]) as real) / Sum([WO_ToManuf]) ELSE 0 END AS ''%OnTime'', "

            + "         CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([1Week]) as real) / Sum([WO_ToManuf]) ELSE 0.00 END AS ''%1Week'', "

            + "         CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([2Weeks]) as real) / Sum([WO_ToManuf]) ELSE 0.00 END AS ''%2Weeks'', "

            + "         CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([1Month]) as real) / Sum([WO_ToManuf]) ELSE 0.00 END AS ''%1Month'', "

            + "         CASE WHEN Sum([WO_ToManuf]) > 0 THEN Cast(Sum([OverMonth]) as real) / Sum([WO_ToManuf]) ELSE 0.00 END AS ''%OverMonth'', "

            + "         CASE WHEN Sum([WO_ToManuf]) > 0 THEN (Cast(Sum([Early]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([OnTime]) as real) / Sum([WO_ToManuf])) ELSE 0 END AS ''%OTD'', "

            + "         CASE WHEN Sum([WO_ToManuf]) > 0 THEN (Cast(Sum([1Week]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([2Weeks]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([1Month]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([OverMonth]) as real) / Sum([WO_ToManuf])) ELSE 0.00 END AS ''%PassDue'', "

            + "         CASE WHEN Sum([WO_ToManuf]) > 0 THEN (Cast(Sum([Early]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([OnTime]) as real) / Sum([WO_ToManuf])) + (Cast(Sum([1Week]) as real) / Sum([WO_ToManuf])) ELSE 0 END AS ''%SupplyGrade'' "

            + "     FROM "

            + "           (SELECT "

            + "                1 AS ''ID'', "

            + "                Accounts.FULLNAME AS ''Accounts.FullName'', "

            + "                CASE WHEN StockMoves.DETAILS is not Null THEN 1 ELSE 0 END AS ''WorkOrders'', "

            + "                CASE WHEN StockMoves.REFERENCE = 0 THEN 1 ELSE 0 END AS ''WO_FromStock'', "

            + "                CASE WHEN StockMoves.REFERENCE <> 0 THEN 1 ELSE 0 END AS ''WO_ToManuf'', "

            + "                CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) < 0 THEN 1 ELSE 0 END AS ''Early'', "

            + "                CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) = 0 THEN 1 ELSE 0 END AS ''OnTime'', "

            + "                CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) BETWEEN 1 AND 7 THEN 1 ELSE 0 END AS ''1Week'', "

            + "                CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) BETWEEN 8 AND 14 THEN 1 ELSE 0 END AS ''2Weeks'', "

            + "                CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) BETWEEN 15 AND 30 THEN 1 ELSE 0 END AS ''1Month'', "

            + "                CASE WHEN StockMoves.REFERENCE <> 0 AND Cast(Stock.ValueDate - StockMoves2.DUEDATE as int) > 30 THEN 1 ELSE 0 END AS ''OverMonth'' "

            + "            FROM ITEMS AS Items "

            + "                INNER JOIN STOCKMOVES AS StockMoves "

            + "                INNER JOIN STOCK AS Stock ON StockMoves.STOCKID = Stock.ID "

            + "                INNER JOIN DOCUMENTSDEF AS DocumentsDef ON StockMoves.DOCUMENTID = DocumentsDef.DOCUMENTID "

            + "                INNER JOIN ACCOUNTS AS Accounts ON Stock.ACCOUNTKEY = Accounts.ACCOUNTKEY ON Items.ITEMKEY = StockMoves.ITEMKEY "

            + "                LEFT JOIN StockMoves AS StockMoves2 ON StockMoves.DETAILS = StockMoves2.DETAILS AND StockMoves2.DOCUMENTID In (6, 36) "

            + "            WHERE "

            + "                Accounts.SORTGROUP Between 3000 And 3999 "

            + "                AND Items.ITEMKEY Not In (''ZI'',''ZP'',''*'',''.'',''@'',''#'') "

            + "                AND Stock.VALUEDATE BETWEEN convert(datetime, @FirstDate, 121) AND convert(datetime, @LastDate, 121) "

            + "                AND StockMoves.DOCUMENTID In (1, 2, 35) "

            + "           )AS A "

            + "     GROUP BY "

            + "         [ID], "

            + "         [Accounts.FULLNAME] "

            + "     WITH ROLLUP "

            + "   ) AS B "

            + " WHERE "

            + " grp = 0 AND [WO_ToManuf] > 0 "

            + " 'end "

            + "";

 

        private void OTDWorker_DoWork(object sender, DoWorkEventArgs e)

        {

            // Check if Stored Procedure already exists, if not, create it.

            CreateOTDStoredProc(otdStoredProc);

            ExecOTDStoredProc(" EXEC Condor_Telcon2006_ON_TIME_DELIVERY_20081002000 ", dsOTD);

        }

 

        private void CreateOTDStoredProc(string storedProcedure)

        {

            // Declare Database name

            string dbName = " a ";

            string conn = @"server=;uid=;pwd=;database=" + dbName;

 

            try

            {

                using (SqlConnection myConnection = new SqlConnection(conn))

                {

                    using (SqlCommand sqlComm = new SqlCommand())

                    {

                        myConnection.Open();

                        sqlComm.Connection = myConnection;

 

                        // Select the database.

                        sqlComm.CommandText = "USE " + dbName;

                        sqlComm.ExecuteNonQuery();

 

                        // Create sp (If Stored Procedure doesn't exists).

                        sqlComm.CommandText = storedProcedure;

                        sqlComm.ExecuteNonQuery();

 

                        myConnection.Close();

                    }

                }

            }

            catch (Exception ex)

            {

                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                System.Windows.Forms.Application.Exit(); // finish the program

            }

        }

 

        private void ExecOTDStoredProc(string execString, DataSet ds)

        {

            // Declare Database name

            string dbName = " a ";

            string conn = @"server=;uid=;pwd=;database=" + dbName;

 

            try

            {

                using (SqlConnection myConnection = new SqlConnection(conn))

                {

                    using (SqlCommand sqlComm = new SqlCommand())

                    {

                        myConnection.Open();

                        sqlComm.Connection = myConnection;

 

                        // Select the database.

                        sqlComm.CommandText = "USE " + dbName;

                        sqlComm.ExecuteNonQuery();

 

                        // Execute sp.

                        sqlComm.CommandText =

                            execString +

                            " @FirstDate = " + "'" + dtFirstDate.Value.ToString("yyyy/MM/dd 00:00:00.000") + "'" + ", " +

                            " @LastDate = " + "'" + dtLastDate.Value.ToString("yyyy/MM/dd 00:00:00.000") + "'" +

                            "";

                        sqlComm.ExecuteNonQuery();

 

                        using (SqlDataAdapter da = new SqlDataAdapter(sqlComm))

                        {

                            //DataSet ds = new DataSet();

                            da.Fill(ds);

                            //dgv1.DataSource = ds.Tables[0];

                        }

                        myConnection.Close();

                    }

                }

            }

            catch (Exception ex)

            {

                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                System.Windows.Forms.Application.Exit(); // finish the program

            }

        }

 

#region Variable Declaration

// Dataset.

private DataSet dsOTD = new DataSet();

#endregion