5

Una consulta bastante completa del cerebro ha aparecido mil y una formas de pasar listas de parámetros de longitud variable que implican procedimientos tales como:Sane método/rápido para pasar listas de parámetros variables para SqlServer2008 procedimiento almacenado

Nuestros requisitos son pasar dos listas de longitud variable de enteros (~ máx. 20 ints) a un procedimiento almacenado. Todos los métodos descritos anteriormente parecen oler gracioso.

¿Es esta la forma en que se debe hacer o hay una forma mejor?

Editar: me acaba de encontrar this, lo que puede plantear esta cuestión como una víctima

+1

Mi reacción inicial a la tabla de "Números" fue similar a la suya. Resulta que es un método ampliamente aceptado para esta y otras tareas similares. Fue popularizado por (el muy respetado) Jeff Moden. Vea estos artículos para discusiones en profundidad: ["The" Numbers "o" Tally "Table: Qué es y cómo reemplaza un bucle."] (Http://www.sqlservercentral.com/articles/TSQL/62867/) y ["Pasar parámetros como ... matrices"] (http://www.sqlservercentral.com/articles/T-SQL/63003/) – kmote

Respuesta

7

Sí, definitivamente vería en Table Valued Parameters para esto. Como beneficio adicional, puede permitirle utilizar una implementación limpia y agradable basada en conjuntos para las partes internas de su procedimiento directamente, sin necesidad de ningún masaje de datos.

Aquí es another reference así ...

+0

+1 - sí, TVP son * LA * solución para esta edad- viejo problema en SQL Server! –

1

Aquí es un método bastante rápido como para dividir cadenas usando solamente T-SQL y parámetro de entrada es sólo una cadena. Necesita tener una tabla y una función (como se describe a continuación) ya configuradas para usar este método.

crear esta tabla:

CREATE TABLE Numbers (Number int not null primary key identity(1,1)) 
DECLARE @n int 
SET @n=1 
SET IDENTITY_INSERT Numbers ON 
WHILE @N<=8000 
BEGIN 
    INSERT INTO Numbers (Number) values (@n) 
    SET @[email protected]+1 
END 
SET IDENTITY_INSERT Numbers OFF 

crear esta función para dividir la matriz de cadenas (tengo otras versiones, donde se eliminan las secciones vacías y las que no devuelven números de fila):

CREATE FUNCTION [dbo].[FN_ListAllToNumberTable] 
(
    @SplitOn    char(1)    --REQUIRED, the character to split the @List string on 
    ,@List     varchar(8000)  --REQUIRED, the list to split apart 
) 
RETURNS 
@ParsedList table 
(
    RowNumber int    --REQUIRED, the list to split apart 
    ,ListValue varchar(500) --OPTIONAL, the character to split the @List string on, defaults to a comma "," 

) 
AS 
BEGIN 

--this will return empty rows, and row numbers 
INSERT INTO @ParsedList 
     (RowNumber,ListValue) 
    SELECT 
     ROW_NUMBER() OVER(ORDER BY number) AS RowNumber 
      ,LTRIM(RTRIM(SUBSTRING(ListValue, number+1, CHARINDEX(@SplitOn, ListValue, number+1)-number - 1))) AS ListValue 
     FROM (
       SELECT @SplitOn + @List + @SplitOn AS ListValue 
      ) AS InnerQuery 
      INNER JOIN Numbers n ON n.Number < LEN(InnerQuery.ListValue) 
     WHERE SUBSTRING(ListValue, number, 1) = @SplitOn 

RETURN 

END 
go 

aquí es un ejemplo de cómo dividir el parámetro aparte:

CREATE PROCEDURE TestPass 
(
    @ArrayOfInts varchar(255) --pipe "|" separated list of IDs 
) 
AS 

SET NOCOUNT ON 

DECLARE @TableIDs TABLE (RowNumber int, IDValue int null) 

INSERT INTO @TableIDs (RowNumber, IDValue) SELECT RowNumber,CASE WHEN LEN(ListValue)<1 then NULL ELSE ListValue END FROM dbo.FN_ListAllToNumberTable('|',@ArrayOfInts) 

SELECT * FROM @TableIDs 
go 

esta es la base d en: http://www.sommarskog.se/arrays-in-sql.html

Cuestiones relacionadas