Ok. Da Sie eine neue gespeicherte Prozedur hinzufügen können, würde ich vorschlagen, alle Werte zu packen und sie als XML an Ihre gespeicherte Prozedur zu senden.
Sie können ein bisschen Beispiel finden Sie hier: http://granadacoder.wordpress.com/2009/01/27/bulk-insert-example-using-an-idatareader-to-strong-dataset-to-sql-server-xml/
Die gute Nachricht, dass Beispiel, das ich habe, ist älter und kodiert SQL Server 2000 (mit OPENXML).
..
Dies wäre besser als das Senden nach unten 300 Parameter an eine gespeicherte Prozedur, IMHO.
Der andere Vorteil, wenn Sie mehr als 1 Reihe Daten haben, können Sie das auch versenden.
......
Der "Kern" davon:
Erstens können Sie die 2000 "Pubs" Datenbank hier:
http://www.microsoft.com/en-us/download/details.aspx?id=23654
Nun ist diese hinzufügen Stored Procedure:
/* USP */
DROP PROCEDURE dbo.uspTitleUpsert
GO
CREATE PROCEDURE dbo.uspTitleUpsert (
@xml_doc TEXT ,
@numberRowsAffected int output --return
)
AS
SET NOCOUNT ON
DECLARE @hdoc INT -- handle to XML doc
DECLARE @errorTracker int -- used to "remember" the @@ERROR
DECLARE @updateRowCount int
DECLARE @insertRowCount int
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @XML_Doc
-- build a table (variable table) to store the xml-based result set
DECLARE @titleupdate TABLE (
identityid int IDENTITY (1,1) ,
title_id varchar(6) ,
title varchar(80) ,
type varchar(32) ,
pub_id varchar(32) ,
price money ,
advance money ,
royalty varchar(32) ,
ytd_sales varchar(32) ,
notes TEXT ,
pubdate datetime
)
--the next call will take the info IN the @hdoc(with is the holder for @xml_doc), and put it IN a variableTable
INSERT @titleupdate
(
title_id ,
title ,
type ,
pub_id ,
price ,
advance ,
royalty ,
ytd_sales ,
notes ,
pubdate
)
SELECT
title_id ,
title ,
type ,
pub_id ,
price ,
advance ,
royalty ,
ytd_sales ,
notes ,
getdate() /*dbo.udf_convert_xml_date_to_datetime (pubdate)*/
FROM
-- use the correct XPath .. the second arg ("2" here) distinquishes
-- between textnode or an attribute, most times with
--.NET typed datasets, its a "2"
--This xpath MUST match the syntax of the DataSet
OPENXML (@hdoc, '/TitlesDS/Titles', 2) WITH (
title_id varchar(6) ,
title varchar(80) ,
type varchar(32) ,
pub_id varchar(32) ,
price money ,
advance money ,
royalty varchar(32) ,
ytd_sales varchar(32) ,
notes TEXT ,
pubdate varchar(32)
)
EXEC sp_xml_removedocument @hdoc
select * from @titleupdate
SET NOCOUNT OFF
Update
dbo.titles
set
title = vart.title ,
type = vart.type ,
pub_id = vart.pub_id ,
price = vart.price ,
advance = vart.advance ,
royalty = vart.royalty ,
ytd_sales = vart.ytd_sales ,
notes = vart.notes ,
pubdate = vart.pubdate
FROM
@titleupdate vart , dbo.titles realTable
WHERE
(rtrim(upper(realTable.title_id))) = ltrim(rtrim(upper(vart.title_id)))
and
exists
(
select null from dbo.titles innerRealTable where (rtrim(upper(innerRealTable.title_id))) = ltrim(rtrim(upper(vart.title_id)))
)
Select @updateRowCount = @@ROWCOUNT
INSERT INTO dbo.titles
(
title_id ,
title ,
type ,
pub_id ,
price ,
advance ,
royalty ,
ytd_sales ,
notes ,
pubdate
)
Select
title_id ,
title ,
type ,
pub_id ,
price ,
advance ,
royalty ,
ytd_sales ,
notes ,
pubdate
FROM
@titleupdate tu
WHERE
not exists
(
select null from dbo.titles innerRealTable where (rtrim(upper(innerRealTable.title_id))) = ltrim(rtrim(upper(tu.title_id)))
)
Select @insertRowCount = @@ROWCOUNT
print '/@insertRowCount/'
select @insertRowCount
print ''
print '/@updateRowCount/'
select @updateRowCount
print ''
select @numberRowsAffected = @insertRowCount + @updateRowCount
--select * from titles
SET NOCOUNT OFF
GO
--GRANT EXECUTE on dbo.uspTitleUpsert TO pubsuser
GO
/* Beispiel für die Verwendung */
EXEC dbo.uspTitleUpsert
'
<TitlesDS>
<Titles>
<title_id>PN3333</title_id>
<title>Peanut Cooking</title>
<type>trad_cook</type>
<pub_id>0877</pub_id>
<price>3.33</price>
<advance>4444.00</advance>
<royalty>1</royalty>
<ytd_sales>33</ytd_sales>
<notes>Peanut Cooking Notes</notes>
<pubdate></pubdate>
</Titles>
<Titles>
<title_id>SSMS4444</title_id>
<title>Sql Server Management Studio</title>
<type>programming</type>
<pub_id>0877</pub_id>
<price>13.33</price>
<advance>5444.00</advance>
<royalty>2</royalty>
<ytd_sales>33</ytd_sales>
<notes>Sql Server Management Studio Notes</notes>
<pubdate></pubdate>
</Titles>
</TitlesDS>
'
, 0
Warum verwenden Sie nicht Stored Procedure? Es wird eine verdammt viel einfacher als das sein. –
SqlCommand. Du willst das alles serverseitig. – Stu
Können Sie der Datenbank eine neue gespeicherte Prozedur hinzufügen? – granadaCoder