none
Pasar por parámetro table en función sql RRS feed

  • Pregunta

  • Hola buen día, tengo una consulta SQL en una aplicación C#, el problema es que es muy lento así que quería migrar todo a una función SQL y tengo algunas dudas al respecto. 

    1- Si es posible pasar por parámetro una tabla a una función SQL, algo como

    CREATE FUNCTION dbo.Estado
    (
    @oTable TABLE
    )
    
    RETURN VARCHAR (1000)
    AS
    BEGIN
    **
    **
    END

    haciéndolo así me marca en rojo la palabra TABLE, también probé así pero pasa lo mismo

    @oTable TABLE (@estado varchar (100))

    2- Hay algún equivalente a foreach (DataRow dr in dt.Rows) para recorrer toda la tabla?

    Para poner un poco en contexto, lo que hace el método es recorrer la tabla con tres campos, dependiendo de los valores de los tres campos hace un flujo distinto para finalmente concatenar todo a un string

    SET @cCad = @cCad + ';' + @valor1+ ';' + @valor2

    Muchas gracias, saludos

    viernes, 7 de abril de 2017 13:47

Respuestas

  • 1.- Para pasar un TABLE a la funcion, primero hay que declarar el tipo de table con un CREATE TYPE, y luego en la funcion se pone el nombre de tipo que creaste (y no se pone la palabra "TABLE", por eso te da un error). Recuerda que es obligatorio ponerle READONLY, mira la sintaxis en la documentacion de MSDN:

    https://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspx

    2.- No hay un "foreach". La tabla que has pasado se procesa igual que si fuese una tabla "de verdad" en la base de datos, es decir, sacas filas con un "SELECT", y puedes si quieres poner "...WHERE..." para filtrar filas con el criterio que quieras. Tambien podrias usar un CURSOR, empleando la misma sintaxis que si lo crearas sobre una tabla "normal".

    viernes, 7 de abril de 2017 14:26
  • Puedes usar un cursor. Mira en esta página:

    https://docs.microsoft.com/en-us/sql/t-sql/language-elements/fetch-transact-sql

    y baja hasta donde está el ejemplo B. Ahí ves cómo se usa el cursor con su bucle WHILE, metiendo los valores de la fila en las variables que vienen detrás del INTO en la sentencia FETCH.Aunque el ejemplo hace un SELECT FROM una tabla normal, también puedes poner SELECT FROM @MiTabla, usando la tabla que pasaste como argumento.

    viernes, 7 de abril de 2017 18:44

Todas las respuestas

  • 1.- Para pasar un TABLE a la funcion, primero hay que declarar el tipo de table con un CREATE TYPE, y luego en la funcion se pone el nombre de tipo que creaste (y no se pone la palabra "TABLE", por eso te da un error). Recuerda que es obligatorio ponerle READONLY, mira la sintaxis en la documentacion de MSDN:

    https://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspx

    2.- No hay un "foreach". La tabla que has pasado se procesa igual que si fuese una tabla "de verdad" en la base de datos, es decir, sacas filas con un "SELECT", y puedes si quieres poner "...WHERE..." para filtrar filas con el criterio que quieras. Tambien podrias usar un CURSOR, empleando la misma sintaxis que si lo crearas sobre una tabla "normal".

    viernes, 7 de abril de 2017 14:26
  • Ya pude resolver el primer problema, como hago para recorrer la tabla en un while y tomar los valores fila por fila en cada ciclo?
    viernes, 7 de abril de 2017 18:19
  • Puedes usar un cursor. Mira en esta página:

    https://docs.microsoft.com/en-us/sql/t-sql/language-elements/fetch-transact-sql

    y baja hasta donde está el ejemplo B. Ahí ves cómo se usa el cursor con su bucle WHILE, metiendo los valores de la fila en las variables que vienen detrás del INTO en la sentencia FETCH.Aunque el ejemplo hace un SELECT FROM una tabla normal, también puedes poner SELECT FROM @MiTabla, usando la tabla que pasaste como argumento.

    viernes, 7 de abril de 2017 18:44