12

How can I pass an array variable to a SQL Server stored procedure using C# and insert array values into a whole row?

Thanks in advance.

SQL Server table:

ID    | Product | Description
-------------------------------
8A3H  | Soda    | 600ml bottle

C# array:

string[] info = new string[] {"7J9P", "Soda", "2000ml bottle"};

SQL Server stored procedure:

ALTER PROC INSERT
    (@INFO_ARRAY ARRAY)
AS
BEGIN
    INSERT INTO Products VALUES (@INFO_ARRAY)
END
6
  • 2
    Is there any reason why you can't just use multiple parameters or are you just looking for a shortcut? Commented Jul 8, 2014 at 16:12
  • 4
    This might help - stackoverflow.com/questions/11102358/… Commented Jul 8, 2014 at 16:13
  • Just looking a shortcut. @DStanley Commented Jul 8, 2014 at 16:16
  • You can use a TVP. Commented Jul 8, 2014 at 16:17
  • Sorry, that's not a simple option in T-SQL. You could probably get it to work with dynamic sql or table-valued parameters but it would be cleaner and safer to use multiple parameters. Commented Jul 8, 2014 at 16:19

2 Answers 2

22

In SQL Server 2008 and later

Create a type in SQL Server like so:

CREATE TYPE dbo.ProductArray 
AS TABLE
(
  ID INT,
  Product NVARCHAR(50),
  Description NVARCHAR(255)
);

Alter your procedure in SQL Server:

ALTER PROC INSERT_SP
@INFO_ARRAY AS dbo.ProductArray READONLY
AS
BEGIN
    INSERT INTO Products SELECT * FROM @INFO_ARRAY
END

Then you'll need to create a DataTable object with values to pass in C#:

DataTable dt = new DataTable();
//Add Columns
dt.Columns.Add("ID");
dt.Columns.Add("Product");
dt.Columns.Add("Description");
//Add rows
dt.Rows.Add("7J9P", "Soda", "2000ml bottle");

using (conn)
{
    SqlCommand cmd = new SqlCommand("dbo.INSERT_SP", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter dtparam = cmd.Parameters.AddWithValue("@INFO_ARRAY", dt);
    dtparam.SqlDbType = SqlDbType.Structured;
}
Sign up to request clarification or add additional context in comments.

6 Comments

This looks almost identical to the answer in the link I posted above. Did you write this yourself or have you changed that answer?
I wrote this based on code I wrote a few weeks back, based on an article I found here: link
I have an error in the Stored Procedure: "Must declare a scalar variable "@INFO_ARRAY"" @kerbasaurus
"INFO_ARRAY" is a table, not a scalar, so in your stored proc, INSERT INTO Products VALUES (@INFO_ARRAY) needs to be changed to INSERT INTO Products SELECT * FROM @INFO_ARRAY
Fix the 2nd to last line to read, dtparam.SqlDbType = SqlDbType.Structured;
|
2

here is a way simpler example:

I've been searching through all the examples and answers of how to pass any array to sql server,till i found this linK, below is how I applied it to my project:

--The following code is going to get an Array as Parameter and insert the values of that --array into another table

Create Procedure Proc1 



@INFO_ARRAY ARRAY nvarchar(max)  //this is the array your going to pass from C# code

AS

    declare @xml xml

    set @xml = N'<root><r>' + replace(@INFO_ARRAY,',','</r><r>') + '</r></root>'

    Insert into Products 
    select 
     t.value('.','varchar(max)')


    from @xml.nodes('//root/r') as a(t)
END 

Hope you enjoy it

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.