Puede utilizar este tipo de instrucción de inserción
insert into tblMyTable (Col1, Col2, Col3)
select 'value1', value, 'value3'
from dbo.values2table('abc,def,ghi,jkl',',',-1) V
El 'valor', 'valor3' y 'abc, def, ghi, jkl' son los 3 parámetros varchar que necesita para establecer en C# SQLCommand.
Esta es la función de soporte necesaria.
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]1)
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
Los parámetros utilizados son:
- '' = delimitador
- -1 = todos los valores en la matriz, o N por sólo primeros artículos N
solución es arriba, alternativas debajo de
O, si lo desea, un enfoque puramente CTE no respaldado por ninguna función dividida (ver comme NTS con < < <)
;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
enfoque 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)
En código C#, sólo se usarían 4 líneas que comienzan por "insertar tblMyTable ..." y parametrizar la variable @xmlstr.
Puede especificar múltiples líneas de 'valores'. Generaría el SQL programáticamente en este caso (¡incluso puede usar marcadores de posición con las funciones SqlCommand! No se requiere inyección fea).Si realmente quieres pasar una "matriz", considera el tipo de XML y un sproc que hacer, bueno, más o menos lo que haría el código C#. Puede descomponer el tipo de XML en un tipo de tabla, pero a expensas de un sproc/T-SQL, no está seguro de si ese es un enfoque que * realmente * desea tomar. –
Guau, no sabía que podría hacer múltiples líneas de 'valores' hasta ahora. Marcadores de posición en SqlCommand()? ¿Puedes darme un pequeño ejemplo de lo que estás hablando? Los únicos marcadores de posición de los que he oído hablar son de ASP.NET pero mi aplicación es Windows Form ... – snickered
@pst - Respondiste mi pregunta, pero no puedo darte crédito porque está en los comentarios. Repost en las respuestas si te importa ... – snickered