Concat nombre de parámetro para recorrer los parámetros

Tengo un procedimiento que acepta múltiples parámetros varchar (4000) (26 de ellos).

Cada uno de ellos es una cadena de valores separados por comas.

Una vez que se pasan, me gustaría separar cada una de las cadenas e insertarlas en una tabla temporal para usarlas más adelante en el proceso.

Preferiría no escribir una declaración que procese cada parámetro individualmente, sino escribir un ciclo while que dependa de un contador para recorrer cada parámetro y procesar cada uno a su vez. Actualmente, he intentado lo siguiente, pero no es correcto.

CREATE PROCEDURE [dbo].[myproc] (
    @string1 varchar(4000) = null;
    @string2 varchar(4000) = null;
    @string3 varchar(4000) = null;
    ....declare @string4 -> @string25...
    @string26 varchar(4000) = null;)

CREATE TABLE #emails (
    address varchar(80)
     )

Set @counter = 1

WHILE @counter < 27
BEGIN
INSERT INTO #emails(address) SELECT element as address from FT_SPLIT_LIST(isNull('@string'+convert(varchar,@counter),''),',')
SET @counter = @counter +1
END

SELECT * FROM #emails

Actualmente, esto no devuelve una tabla con todos los CSV de @string1 -> @string26.

FT_SPLIT_LIST funciona, lo uso en muchos otros lugares. Solo necesito saber si hay una manera de declarar dinámicamente el parámetro que se le está pasando.

¿Hay alguna forma de hacer lo que estoy tratando de lograr sin escribir una declaración para cada uno de los parámetros @string1->@string27?

Gracias c

preguntado el 03 de mayo de 12 a las 16:05

¿Qué versión de SQL Server estás usando? -

Qué tienes carga esos parametros? Es casi seguro que esta es la forma "incorrecta" de hacerlo en primer lugar. La respuesta de @ Oded parece que debería ser buena; si eso no funciona, podría ver cómo cargar los datos en una tabla temporal a través de LOAD (Creo que quizás IMPORT?) y luego hacer una actualización por lotes desde allí. -

Oded, gracias por la respuesta. Voy a mirar el enlace que pusiste. En este caso, estoy limitado por el sistema con el que me estoy integrando. Los parámetros de cadena se pasan a la base de datos a través de la API web y, como resultado, debo pasar los parámetros como Varchar (4000) y en fragmentos. Preferiría pasar el contenido como XML, pero eso no es posible a través de la API del sistema. Mi restricción es que los datos tienen que llegar de la forma en que están entrando actualmente. Dado que tengo eso, ¿hay alguna sugerencia sobre cómo tomar varias cadenas CSV e iterar sobre ellas para insertarlas en una tabla? -

1 Respuestas

SQL Server 2008 y superior tienen parámetros con valores de tabla:

Los parámetros con valores de tabla se declaran mediante tipos de tabla definidos por el usuario. Puede usar parámetros con valores de tabla para enviar varias filas de datos a una instrucción Transact-SQL o una rutina, como una función o un procedimiento almacenado, sin crear una tabla temporal o muchos parámetros.

Estas son una opción mucho mejor que los varchars delimitados por comas y FT_SPLIT_LIST.

Sugiero leer Matrices y listas en SQL Server 2008 mediante parámetros con valores de tabla por Erland Sommarskog para una discusión completa sobre este tema.

contestado el 03 de mayo de 12 a las 16:05

Oded, gracias por la respuesta. Definitivamente miraré el enlace que publicaste. - cza

+1 Vine aquí para publicar sobre TVP... definitivamente el método preferido para recorrer CSV.... - Mateo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.