Pregunta

Miré el sitio web de SQLTeam pero ahora tengo un nuevo problema porque tengo una columna IDENTIDAD y su ejemplo no.

Tengo SQL Server 2008 y VS 2008. Estoy intentando ejecutar el SP InsertPIF usando C # y una tabla UDT, pero obtengo una excepción. He mirado un sitio web de SQLTeam ejemplo con una tabla UDT, pero su ejemplo no tiene una columna de identidad como la mía.

Sin embargo, su tabla de ejemplo no tiene una columna de identidad como la mía. Lo que estoy tratando de hacer debería ser simple. He intentado muchas variaciones diferentes de esto, pero esencialmente:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
INSERT dbo.ParentTable SELECT strRow FROM @InputFileParam
GO

donde

CREATE TABLE [dbo].[ParentTable](
    [ParentID] [int] IDENTITY(1,1) NOT NULL,
    [strInput] [varchar](8000) NULL,
PRIMARY KEY NONCLUSTERED 
(...)

y escriba:

CREATE TYPE [dbo].[parseInputFile] AS TABLE(
    [NumCols] [int] IDENTITY(1,1) NOT NULL,
    [strRow] [varchar](500) NOT NULL,
    PRIMARY KEY CLUSTERED 
(...)

Lo que intento hacer es ejecutar el SP anterior para insertar nuevos registros en ParentTable. Ejemplo:

INSERT INTO ParentTable(strInput) VALUES ('A3|BB|C|DDD')
INSERT INTO ParentTable(strInput) VALUES ('A4|GOB|BLDY|GOOK')
INSERT INTO ParentTable(strInput) VALUES ('A5|Hello|My|Darling')

Aquí hay más de mi código C # antes de la sección AppendData:

DataTable dt = new DataTable();
String[] header = myStringArray[0].Split('|');

DataRow dr = dt.NewRow();
DataColumn dc = new DataColumn();
dc.DataType = typeof(Int32);
dc.ColumnName = “NumCols”;
dc.AutoIncrement=true;
dt.Columns.Add(dc);

DataColumn dc2 = new DataColumn();
dc2.DataType = typeof(string);
dc2.ColumnName = “strRow”;
dt.Columns.Add(dc2);
dr["NumCols"] = 1;
dr["strRow"] = "AA|BBB|CC|DD|E";
dt.Rows.Add(dr);

...
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = "dbo.InsertPIF";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn;
                SqlParameter param = cmd.Parameters.AddWithValue("@InputFileParam", SqlDbType.Structured);

        param.Value = dt;
        conn.Open();
        RowsAffected = cmd.ExecuteNonQuery();

Configuré la identidad para que se active para el ParentTable, pero parece que tengo que ejecutar esto cada sesión, por lo que no estoy seguro de cómo eliminar el requisito de identidad o de lo contrario para que la identidad permanezca activada. Excepción:

INSERTAR en una columna de identidad no permitida en las variables de la tabla. Los datos para el parámetro con valores de tabla '@InputFileParam' no se ajustan al tipo de tabla del parámetro.

¿Cómo ejecuto este SP?

¿Fue útil?

Solución

Creo que Roland está en el camino correcto: las columnas IDENTIDAD definitivamente son el problema. Dado que su tabla de destino final ya tiene una columna IDENTITY que se rellenará automáticamente para usted, recomendaría no especificar la misma columna en su tipo de tabla definida por el usuario (y tampoco declarar una clave principal en el tipo de tabla):

CREATE TYPE [dbo].[parseInputFile] AS TABLE
    ([strRow] [varchar](500) NOT NULL)

Luego, en su código C #, simplemente configure una DataTable con una sola columna:

DataTable dt = new DataTable();

DataColumn dc = new DataColumn();
dc.DataType = typeof(string);
dc.ColumnName = “strRow”;
dt.Columns.Add(dc);

y luego agregue sus columnas a su DataTable " dt " - con solo una cadena " strRow " ;.

En su proceso almacenado que luego se llama con su tipo de tabla definida por el usuario, simplemente inserte sus cadenas:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
  INSERT INTO dbo.ParentTable(strInput)
    SELECT strRow FROM @InputFileParam
GO

¡Eso debería hacerlo, espero! (no he tenido tiempo de probar esto yo mismo)

Marc

Otros consejos

Bien, todavía no he trabajado con TVPs, así que podría estar equivocado, pero por mi lectura, & amp; antecedentes generales de SS, creo que creo su problema es este:

Su tabla permanente tiene una columna de Identidad, por lo que SS quiere manejar eso por usted. puede activar Identity Insert, pero esa no es una buena idea ...

Una cosa para intentar es especificar la columna para insertar en su SP:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
INSERT dbo.ParentTable (strInput) SELECT strRow FROM @InputFileParam
GO

La otra cosa a tener en cuenta, como sugirió Tim Lentine (mientras escribía esta respuesta), es si realmente está llegando al servidor o no. Como ha definido la columna NumCols en su DataTable como AutoIncrement, es posible que obtenga su excepción en el código C #, en:

...
dr["NumCols"] = 1;
...

< editar >

No sé lo que estaba pensando cuando hice clic en Enviar ...

Si ese es el caso, intente omitir el AutoIncrement cuando cree su DataTable. Si los tipos de datos de columna son consistentes, esta propiedad no debería importar al alinear el TVP como & Quot; el mismo & Quot; como el tipo SS.

< / edit >

¿Podría el error provenir de la tabla parseInputFile en su lugar? NumCols se define como un campo de identificación, pero en el código C # está configurando el valor del registro en 1.

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