Cómo pasar una lista separada por comas de un procedimiento almacenado?

Así que tengo un Sybase procedimiento almacenado que tarda de 1 parámetro es una lista separada por comas de las cadenas y se ejecuta una consulta en un (a) la cláusula:

CREATE PROCEDURE getSomething @keyList varchar(4096)
AS
SELECT * FROM mytbl WHERE name IN (@keyList)

¿Cómo puedo llamar a mi procedimiento almacenado con valor de más de 1 en la lista?
Hasta ahora he tratado de

exec getSomething 'John'         -- works but only 1 value
exec getSomething 'John','Tom'   -- doesn't work - expects two variables
exec getSomething "'John','Tom'" -- doesn't work - doesn't find anything
exec getSomething '"John","Tom"' -- doesn't work - doesn't find anything
exec getSomething '\'John\',\'Tom\'' -- doesn't work - syntax error

EDICIÓN: de hecho, encontré este página que tiene una gran referencia de las diversas formas de pas una matriz a un procedimiento almacenado

Espero que hayas encontrado un método que funciona para usted. La página vinculada es una buena lista de opciones, pero me alegro de ver que la mayoría ya han sido sugerido aquí! Pablo método sugerido 2/3, de tablas temporales. Me sugirió el método 1, sql dinámico. Brian y Abel sugieren un XML método, aunque no estoy autorizado para xml en sybase, así que no sé si funcionará en Sybase. Similar al Método 4.
posibles duplicados de la Parametrización de un SQL EN la cláusula?

OriginalEl autor naumcho | 2008-08-08

11 Kommentare

  1. 3

    Si usted está usando Sybase 12.5 o antes, entonces usted no puede utilizar las funciones. Una solución podría ser la de rellenar una tabla temporal con los valores y acceder a ellos desde allí.

    OriginalEl autor Paul Owens

  2. 2

    Este es un poco tarde, pero tuve el mismo problema hace un tiempo y he encontrado una solución.

    El truco es el doble de la cotización y, a continuación, envolver toda la cadena entre comillas.

    exec getSomething """John"",""Tom"",""Bob"",""Harry"""

    Modificar su proc para que coincida con la entrada de la tabla de la cadena.

    CREATE PROCEDURE getSomething @keyList varchar(4096)
    AS
    SELECT * FROM mytbl WHERE @keyList LIKE '%'+name+'%' 

    He tenido este en producción desde ASE 12.5; ahora estamos en 15.0.3.

    Es posible que desee buscar en que… Si usted tiene Jack en la tabla y la búsqueda de Jackie usted realmente va a conseguir Jack 🙂 También es probable que no sea terriblemente eficiente, la creación de una cadena para cada fila en la tabla.

    OriginalEl autor Ben

  3. 1

    Pasar la lista separada por comas en una función que devuelve un valor de la tabla. Hay un MS SQL ejemplo en algún lugar en StackOverflow, maldito si lo puedo ver en el momento.

    CREATE PROCEDURE getSomething @keyList varchar(4096)
    AS
    SELECT * FROM mytbl WHERE name IN (fn_GetKeyList(@keyList))

    Llamada con –

    exec getSomething 'John,Tom,Foo,Bar'

    Supongo Sybase debe ser capaz de hacer algo similar?

    OriginalEl autor Kev

  4. 0

    Qué es necesario para utilizar una lista separada por comas? El último par de años, he estado tomando este tipo de idea y de paso en un archivo XML. El openxml «función» toma una cadena y hace como xml y, a continuación, si crea una tabla temporal con los datos, es consultable.

    DECLARE @idoc int
    DECLARE @doc varchar(1000)
    SET @doc ='
    <ROOT>
    <Customer CustomerID="VINET" ContactName="Paul Henriot">
       <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
          <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
          <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
       </Order>
    </Customer>
    <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
       <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
          <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
       </Order>
    </Customer>
    </ROOT>'
    --Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
    -- Execute a SELECT statement that uses the OPENXML rowset provider.
    SELECT    *
    FROM       OPENXML (@idoc, '/ROOT/Customer',1)
                WITH (CustomerID  varchar(10),
                      ContactName varchar(20))

    OriginalEl autor Brian Childress

  5. 0

    Este es un rápido y sucio método que puede ser útil:

    select  * 
    from    mytbl 
    where   "," + ltrim(rtrim(@keylist)) + "," like "%," + ltrim(rtrim(name)) + ",%"

    OriginalEl autor

  6. 0

    No estoy seguro si es en ASE, pero en SQL Anywhere, la sa_split_list función devuelve una tabla de un archivo CSV. Tiene argumentos opcionales para pasar un delimitador distinto (el valor predeterminado es una coma) y un maxlength para cada valor devuelto.

    sa_split_list función

    OriginalEl autor Lurker Indeed

  7. 0

    El problema con las llamadas, como este: exec getSomething ‘»Juan»,»Tom»‘ es que se trata ‘»Juan»,»Tom», » como una sola cadena, que sólo coincide con una entrada en la tabla que es ‘»Juan»,»Tom»‘.

    Si usted no desea utilizar una tabla temporal como en la respuesta de Pablo, entonces usted podría utilizar sql dinámico. (Se asume que el v12+)

    CREATE PROCEDURE getSomething @keyList varchar(4096)
    AS
    declare @sql varchar(4096)
    select @sql = "SELECT * FROM mytbl WHERE name IN (" + @keyList +")"
    exec(@sql)

    Usted tendrá que asegurarse de que los elementos en @keylist han comillas alrededor de ellos, incluso si son solo valores.

    OriginalEl autor AdamH

  8. 0

    Esto funciona en SQL. Declarar, en su GetSomething procedimiento de una variable de tipo XML como tal:

    DECLARE @NameArray XML = NULL

    El cuerpo del procedimiento almacenado implementa la siguiente:

    SELECT * FROM MyTbl DONDE name IN (SELECT ParamValues.ID.valor(‘.’,’VARCHAR(10)’)
    DESDE @NameArray.los nodos(‘id’) COMO ParamValues(ID))

    Desde dentro de la SQL de código que llama a la SP declarar e inicializar la variable XML antes de llamar al procedimiento almacenado:

    DECLARE @NameArray XML

    SET @NameArray = ‘<id>Name_1</id><id>Name_2</id><id>Name_3</id><id>Name_4</id>’

    El uso de su ejemplo, la llamada al procedimiento almacenado sería:

    EXEC GetSomething @NameArray

    He utilizado este método antes y funciona bien. Si desea una prueba rápida, copia y pega el siguiente código para una nueva consulta y ejecutar:

    DECLARE @IdArray XML

    SET @IdArray = ‘<id>Name_1</id><id>Name_2</id><id>Name_3</id><id>Name_4</id>’

    SELECCIONE ParamValues.ID.valor(‘.’,’VARCHAR(10)’)
    DESDE @IdArray.los nodos(‘id’) COMO ParamValues(ID)

    OriginalEl autor Abel Gaxiola

  9. 0

    A tocar en lo @Abel siempre, lo que me ayudó fue:

    Mi propósito era dar lo que nunca el final introducido por el usuario de SSRS y el uso que en mi cláusula where como En (SELECCIONAR)
    Obviamente @ICD_VALUE_RPT iba a ser un comentario en mi consulta de conjunto de datos.

    DECLARE @ICD_VALUE_RPT VARCHAR(MAX) SET @ICD_VALUE_RPT = 'Value1, Value2'
    DECLARE @ICD_VALUE_ARRAY XML SET @ICD_VALUE_ARRAY = CONCAT('<id>', REPLACE(REPLACE(@ICD_VALUE_RPT, ',', '</id>,<id>'),' ',''), '</id>')

    a continuación, en mi WHERE he añadido:

    (PATS_WITH_PL_DIAGS.ICD10_CODE IN (SELECT ParamValues.ID.value('.','VARCHAR(MAX)') FROM @ICD_VALUE_ARRAY.nodes('id') AS ParamValues(ID))
    OR PATS_WITH_PL_DIAGS.ICD9_CODE IN (SELECT ParamValues.ID.value('.','VARCHAR(MAX)') FROM @ICD_VALUE_ARRAY.nodes('id') AS ParamValues(ID))
    )

    OriginalEl autor DeFlanko

  10. 0

    Trate de esta manera. Su funciona para mí.

    @itemIds varchar(max)
    
    CREATE PROCEDURE getSomething @keyList varchar(4096)
    AS
    SELECT * FROM mytbl WHERE name IN (SELECT Value FROM [Global_Split] (@itemIds,','))

    OriginalEl autor user3732708

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea