Frage

schaute ich auf der SQLTeam Webseite aber jetzt ein neues Problem habe, weil ich eine Identity-Spalte und ihr Beispiel habe nicht.

Ich habe SQL Server 2008 und VS 2008. Ich versuche, die InsertPIF SP mit C # und einer Tabelle UDT auszuführen, aber eine Ausnahme sind immer. Ich habe bei einer SQLTeam Website sieht Beispiel mit einer Tabelle UDT, aber ihr Beispiel Spalte keine Identität haben wie meine tut.

Doch ihr Beispiel Tabelle nicht eine Identitätsspalte wie meine haben. Was ich versuche, einfach zu tun sein sollte. Ich habe viele verschiedene Variationen dieses versucht, aber im Wesentlichen:

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

Dabei steht

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

und Typ:

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

Was ich versuche zu tun ist, um die oben SP auszuführen neue Datensätze in die Parent einzufügen. Beispiel:

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

Hier ist mehr meiner C # -Code vor dem AppendData Abschnitt:

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();

Ich habe Identität für die ParentTable eingeschaltet werden, aber es scheint, wie ich dies bei jeder Sitzung ausgeführt werden, so dass ich bin mir nicht sicher, wie Identität Anforderung zu entfernen oder sonst Identität machen bleiben. Ausnahme:

INSERT in eine Identitätsspalte nicht auf Tabellenvariablen erlaubt. Die Daten für Tabellenwertparameter ‚@InputFileParam‘ entsprechen nicht den Tabellentyp des Parameters.

Wie führe ich dieses SP?

War es hilfreich?

Lösung

Ich denke, Roland auf dem richtigen Weg ist - die Identity-Spalten auf jeden Fall das Problem sind. Da Ihre ultimative bereits Zieltabelle eine Identity-Spalte hat, die für Sie automatisch gefüllt wird, würde ich empfehlen, nicht die gleiche Spalte in der benutzerdefinierten Tabellentyp spezifizieren (und auch einen Primärschlüssel auf den Tabellentyp nicht erklären):

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

Dann in Ihrer C # -Code, nur eine Datatable mit einer einzigen Spalte ein:

DataTable dt = new DataTable();

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

und fügen Sie dann Ihre Spalten zu Ihrem Datatable „dt.“ - mit nur dem einen String „strRow“

Ihre gespeicherte Prozedur, die dann mit Ihrem benutzerdefinierten Tabellentyp aufgerufen wird, einfach nur die Saiten einfügen:

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

Das sollte es tun, ich hoffe! (Habe nicht die Zeit zu testen, das selbst hatte)

Marc

Andere Tipps

Okay, ich habe nicht wirklich arbeite mit TVPs noch, so könnte ich falsch sein - aber aus meiner Lesung & allgemeiner SS Hintergrund, I denkt Ihr Problem ist folgende:

Ihre permanente Tabelle hat eine Identitätsspalte, so SS das für Sie zu handhaben will. Sie können gesetzt Identität Legen Sie auf, aber das ist keine gute Idee ....

Eine Sache, zu versuchen, die Spalte geben Sie bei SP einzufügen:

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

Die andere Sache, zu sehen, wie Tim Lentine vorgeschlagen (während ich diese Antwort schrieb), ist, ob oder nicht Sie tatsächlich an den Server zu bekommen. Da Sie die numCols Spalte in der Datatable als AutoIncrement definiert haben, könnte es sein, dass Sie Ihre Ausnahme in der C # -Code sind immer an:

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

Sie wissen nicht, was ich thnking wenn ich Senden geklickt ...

Wenn das der Fall ist, versuchen Sie die AutoIncrement Weglassen, wenn Sie Ihre Datentabelle creat. Wenn die Spaltendatentypen konsistent ist, soll diese Eigenschaft keine Rolle, wenn die TVP Schlange als „gleich“, wie der SS-Typ zu sein.

Kann der Fehler aus der parseInputFile Tabelle stattdessen kommen? NumCols ist definiert als identifiziert Feld, aber in dem C # -Code Sie den Wert des Eintrags auf 1 setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top