Pregunta

Esta página desde SQL Server 2008 BOL , habla de almacenado CLR procedimientos y tiene una sección llamada, "con valores de tabla Parámetros", que habla de cómo pueden ser ventajosas. Eso está muy bien - Me encantaría usar TVP en mis procsos CLR, pero por desgracia esto parece ser la única referencia en el universo de tal posibilidad, y la sección no describe lo que sería la sintaxis (ni el más información vinculado al final del párrafo)

Claro, puedo encontrar fácilmente las descripciones de cómo utilizar TVP por los procs de T-SQL, o cómo hacer procsos CLR en general. Pero escribir un proc CLR que toma una TVP? Nada. Todo esto es muy poco común desde la aprobación de los datos de varias filas a un procedimiento almacenado es un problema muy popular.

Esto me lleva a preguntarse si la presencia de la sección de esa página es un error. Alguien por favor me dicen que es no y me apunte a más detalles / ejemplos.

[EDIT]

estaba a punto de publicar esto en uno de los foros MS demasiado cuando me encontré esto, que parece ser el último clavo en el ataúd . Parece que no se puede hacer.

¿Fue útil?

Solución

No puedo encontrar una gran cantidad más referencias . Sin embargo, estos son todos para pasar parámetros con valores de tabla con los procedimientos de TSQL, por lo que es de poca utilidad.

Sin embargo, he llegado a la conclusión de que es imposible. En primer lugar, está la lista de href="http://msdn.microsoft.com/en-us/library/ms131092.aspx" rel="noreferrer"> entre CLR y SQL tipos. Para los tipos de tabla no hay ninguna asignación, por lo que el siguiente no funciona, por ejemplo:

[SqlProcedure]
public static void StoredProcedure(DataTable tvp, out int sum)
{
    return 42;
}

y

CREATE TYPE MyTableType AS TABLE 
(
    Id INT NOT NULL PRIMARY KEY,
    [Count] INT NOT NULL
)
GO
CREATE ASSEMBLY ClrTest FROM '<somePath>'
GO
CREATE PROCEDURE ClrTest
AS EXTERNAL NAME ClrTest.StoredProcedures.StoredProcedure
GO

Cualquiera que sea el tipo intenta (DataTable, DbDataReader, IEnumerable), la llamada CREATE PROCEDURE mantiene generar un error 6552: CREATE PROCEDURE para "CLRTest" fracasaron debido a T-SQL y CLR tipos de parámetro "@tvp" no coinciden .

En segundo lugar, la documentación en la página se ha vinculado a dice: Un tipo de tabla definida por el usuario no puede ser pasado como un parámetro con valores de tabla a, o ser devueltos desde un procedimiento almacenado administrado o la función se ejecuta en el SQL proceso del servidor.

Me parece que no puede encontrar en cualquier lugar de cómo crear un tipo de tabla definida por el usuario en C #, pero esto también parece ser un callejón sin salida.

Tal vez usted puede hacer su pregunta en algún lugar en un foro Microsoft. Todavía es extraño que mencionan los parámetros con valores de tabla en la página CLR sproc pero nunca explican cómo implementar esto. Si encuentra alguna solución, me gustaría saber.

Otros consejos

Puede utilizar una tabla temporal creada y poblada antes de llamar al procedimiento y leer la tabla dentro del procedimiento CLR.

La solución es serializar los datos tabulares en una cadena con formato JSON a continuación, pasar la cadena en su proc CLR. Dentro de su proc CLR o función que podría analizar el JSON a una, lista, o un objeto IEnumerable tabular. A continuación, puede trabajar con los datos como lo haría con cualquier otro tipo de datos tabulares.

He escrito algunas utilidades capaces de serialización de cualquier tabla SQL en una cadena de formato JSON. Yo sería feliz de compartir con cualquier persona que preste su dirección de correo electrónico. Phil Factor ha escrito un buen analizador de T-SQL JSON llamó parseJSON. He adaptado su solución al CLR que lleva a cabo mucho más rápido. Ambos aceptan una cadena con formato JSON y producir una tabla de la cadena. También tengo una variedad de utilidades Json I emplear tanto con T-SQL y el CLR capaz de serializar, el análisis, inserción, supresión, y la actualización de cadenas Json formato almacenados en columnas de SQL.

Mientras que parece que pasa directamente a las tablas de procedimientos CLR es imposible en la actualidad, tengo un resultado, aunque sub óptima por:

  • definir una tabla TSQL valioso UDT FooTable
  • definir una función que toma TSQL FooTable como un parámetro y devuelve XML mediante FOR XML EXPLICIT
  • pasar el XML resultante a la función CLR / procedimiento en lugar de la propia tabla

No es ideal, pero se vuelve un poco más cerca.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top