Vous pouvez utiliser ce type d'instruction d'insertion
insert into tblMyTable (Col1, Col2, Col3)
select 'value1', value, 'value3'
from dbo.values2table('abc,def,ghi,jkl',',',-1) V
La 'valeur' , 'value3' et 'abc, def, ghi, JKL' sont les 3 paramètres varchar dont vous avez besoin pour définir dans C# SQLCommand.
Ceci est la fonction de support requise.
CREATE function dbo.values2table
(
@values varchar(max),
@separator varchar(3),
@limit int -- set to -1 for no limit
) returns @res table (id int identity, [value] varchar(max))
as
begin
declare @value varchar(50)
declare @commapos int, @lastpos int
set @commapos = 0
select @lastpos = @commapos, @commapos = charindex(@separator, @values, @lastpos+1)
while @commapos > @lastpos and @limit <> 0
begin
select @value = substring(@values, @lastpos+1, @[email protected])
if @value <> '' begin
insert into @res select ltrim(rtrim(@value))
set @limit = @limit-1
end
select @lastpos = @commapos, @commapos = charindex(@separator, @values, @lastpos+1)
end
select @value = substring(@values, @lastpos+1, len(@values))
if @value <> '' insert into @res select ltrim(rtrim(@value))
return
end
GO
Les paramètres utilisés sont les suivants:
- '' = délimiteur
- -1 = toutes les valeurs de la matrice, ou N pour seulement N premiers points
solution est
ci-dessus, alternatives ci-dessous
Ou, si vous préférez, une approche purement CTE non soutenue par une fonction de split (watch comme nts avec < < <)
;WITH T(value,delim) AS (
select 'abc,def,ghi', ',' --- <<< plug in the value array and delimiter here
), CTE(ItemData, Seq, I, J) AS (
SELECT
convert(varchar(max),null),
0,
CharIndex(delim, value)+1,
1--case left(value,1) when ' ' then 2 else 1 end
FROM T
UNION ALL
SELECT
convert(varchar(max), subString(value, J, I-J-1)),
Seq+1,
CharIndex(delim, value, I)+1, I
FROM CTE, T
WHERE I > 1 AND J > 0
UNION ALL
SELECT
SubString(value, J, 2000),
Seq+1,
CharIndex(delim, value, I)+1, 0
FROM CTE, T
WHERE I = 1 AND J > 1
)
--- <<< the final insert statement
insert into tblMyTable (Col1, Col2, Col3)
SELECT 'value1', ItemData, 'value3'
FROM CTE
WHERE Seq>0
approche XML
-- take an XML param
declare @xml xml
set @xml = '<root><item>abc</item><item>def</item><item>ghi</item></root>'
insert into tblMyTable (Col1, Col2, Col3)
SELECT 'value1', n.c.value('.','varchar(max)'), 'value3'
FROM @xml.nodes('/root/item') n(c)
-- heck, start with xml string
declare @xmlstr nvarchar(max)
set @xmlstr = '<root><item>abc</item><item>def</item><item>ghi</item></root>'
insert tblMyTable (Col1, Col2, Col3)
SELECT 'value1', n.c.value('.','varchar(max)'), 'value3'
FROM (select convert(xml,@xmlstr) x) y
cross apply y.x.nodes('/root/item') n(c)
Dans le code C#, vous n'utiliser 4 lignes commençant par "insérer tblMyTable ..." et paramétrez la variable @xmlstr.
Vous pouvez spécifier plusieurs lignes 'values'. Je voudrais simplement générer le SQL par programmation dans ce cas (vous pouvez même utiliser des espaces réservés avec le truc SqlCommand! Aucune injection de chaîne moche requise).Si vous voulez vraiment passer un "tableau", considérez le type XML et un sproc à faire - enfin, à peu près ce que ferait le code C#. Vous pouvez décomposer le type XML en un type de table, mais au détriment d'un sproc/T-SQL, vous ne savez pas si c'est une approche que vous * voulez * prendre. –
Wow, je ne savais pas que vous pouviez faire plusieurs lignes 'values' jusqu'à maintenant. Placeholders dans SqlCommand()? Pouvez-vous me donner un petit exemple de ce dont vous parlez? Les seuls espaces réservés dont j'ai entendu parler sont pour ASP.NET mais mon application est un Windows Form ... – snickered
@pst - Vous avez répondu à ma question mais je ne peux pas vous donner de crédit puisque c'est dans les commentaires. Repost dans les réponses si ça vous intéresse ... – snickered