Domanda

Ho guardato il sito Web SQLTeam ma ora ho un nuovo problema perché ho una colonna IDENTITY e il loro esempio no.

Ho SQL Server 2008 e VS 2008. Sto cercando di eseguire InsertPIF SP usando C # e una tabella UDT, ma sto ottenendo un'eccezione. Ho guardato un sito Web SQLTeam esempio con una tabella UDT, ma il loro esempio non ha una colonna identità come la mia.

Tuttavia, la loro tabella di esempio non ha una colonna di identità come la mia. Quello che sto cercando di fare dovrebbe essere semplice. Ho provato diverse varianti di questo, ma essenzialmente:

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

dove

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

e digitare:

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

Quello che sto cercando di fare è eseguire il precedente SP per inserire nuovi record nella ParentTable. Esempio:

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')

Ecco altro del mio codice C # prima della sezione 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();

Ho impostato l'identità da attivare per ParentTable, ma sembra che debba eseguire questa operazione ogni sessione, quindi non sono sicuro di come rimuovere il requisito di identità o altrimenti per mantenere l'identità attiva. Eccezione:

INSERISCI in una colonna di identità non consentita nelle variabili di tabella. I dati per il parametro con valori di tabella '@InputFileParam' non sono conformi al tipo di tabella del parametro.

Come eseguo questo SP?

È stato utile?

Soluzione

Penso che Roland sia sulla buona strada: le colonne IDENTITY sono sicuramente il problema. Poiché la tabella di destinazione finale ha già una colonna IDENTITY che verrà compilata automaticamente per te, ti consiglio di non specificare la stessa colonna nel tipo di tabella definito dall'utente (e inoltre non dichiarare una chiave primaria sul tipo di tabella):

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

Quindi nel tuo codice C #, imposta una DataTable con una singola colonna:

DataTable dt = new DataTable();

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

e quindi aggiungi le colonne alla tua DataTable " dt " - con solo una stringa " strRow " ;.

Nel tuo proc memorizzato che viene quindi chiamato con il tipo di tabella definito dall'utente, inserisci semplicemente le tue stringhe:

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

Dovrebbe farlo, spero! (non ho avuto il tempo di testarlo da solo)

Marc

Altri suggerimenti

Okay, non ho ancora lavorato con i TVP, quindi potrei sbagliarmi, ma dalla mia lettura, & amp; generale sfondo SS, penso il tuo problema è questo:

La tua tabella permanente ha una colonna Identity, quindi SS vuole gestirla per te. Puoi puoi attivare Identity Insert, ma non è una buona idea ....

Una cosa da provare è specificare la colonna da inserire nel tuo SP:

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

L'altra cosa da guardare, come ha suggerito Tim Lentine (mentre stavo scrivendo questa risposta), è se stai effettivamente arrivando al server. Poiché hai definito la colonna NumCols nella tua DataTable come AutoIncrement, è possibile che tu stia ottenendo la tua eccezione nel codice C #, all'indirizzo:

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

lt &; modificare gt &;

Non so cosa stavo pensando quando ho fatto clic su Invia ...

In tal caso, prova a tralasciare AutoIncrement quando crei la tua DataTable. Se i tipi di dati della colonna sono coerenti, questa proprietà non dovrebbe importare quando si allinea il TVP come & Quot; lo stesso & Quot; come tipo SS.

lt &; / Modificare gt &;

L'errore potrebbe provenire invece dalla tabella parseInputFile? NumCols è definito come un campo identificativo, ma nel codice C # si imposta il valore del record su 1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top