문제

SQLTEAM 웹 사이트를 살펴 보았지만 이제는 신원 열이 있고 그 예제는 그렇지 않습니다.

SQL Server 2008 및 vs 2008이 있습니다. C#과 테이블 UDT를 사용하여 InsertPif SP를 실행하려고하지만 예외가 있습니다. 테이블 UDT가있는 SQLTEAM 웹 사이트 예제를 살펴 보았지만 예제에는 내 것과 같은 신원 열이 없습니다.

그러나 그들의 예제 테이블에는 나의 것과 같은 신원 열이 없습니다. 내가하려는 것은 간단해야합니다. 나는 이것의 여러 가지 변형을 시도했지만 본질적으로 :

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

어디

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

및 유형 :

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

내가하려는 것은 위의 SP를 실행하여 새 레코드를 Parenttable에 삽입하는 것입니다. 예시:

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

다음은 부록 섹션 이전의 C# 코드입니다.

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

나는 신원을 켜지도록 설정했다 ParentTable, 그러나 각 세션 마다이 세션을 실행 해야하는 것 같습니다. 따라서 신원 요구 사항을 제거하거나 신원을 유지하는 방법을 잘 모르겠습니다. 예외:

테이블 변수에 허용되지 않는 ID 열에 삽입하십시오. 테이블 값 매개 변수 '@inputfileparam'의 데이터는 매개 변수의 테이블 유형을 준수하지 않습니다.

이 SP를 어떻게 실행합니까?

도움이 되었습니까?

해결책

롤랜드가 올바른 길을 가고 있다고 생각합니다. 신원 열이 확실히 문제입니다. Ultimate Target Table은 이미 자동으로 채워진 ID 열이 있으므로 사용자 정의 테이블 유형에 동일한 열을 지정하지 않는 것이 좋습니다 (테이블 유형의 기본 키를 선언하지 않음).

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

그런 다음 C# 코드에서 단일 열로 데이터 가능을 설정합니다.

DataTable dt = new DataTable();

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

그런 다음 하나의 문자열 "strrow"만 사용하여 DataTable "DT"에 열을 추가하십시오.

저장된 Proc에서 사용자 정의 테이블 유형으로 호출되면 문자열을 간단히 삽입하십시오.

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

그렇게해야합니다. (이것을 직접 테스트 할 시간이 없었습니다)

마크

다른 팁

좋아요, 아직 TVPS와 함께 일하지 않았으므로 틀릴 수 있습니다. 그리고 내 독서와 일반 SS 배경에서 나옵니다. 생각한다 당신의 문제는 이것입니다 :

영구 테이블에는 ID 열이 있으므로 SS는 귀하를 위해이를 처리하려고합니다. 너 ~할 수 있다 Identity Insert를 설정하지만 좋은 생각은 아닙니다 ....

시도해야 할 한 가지는 SP에 삽입 할 열을 지정하는 것입니다.

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

Tim Lentine이 제안한 것처럼 (이 답변을 작성하는 동안) 실제로 살펴볼 것입니다. 실제로 서버에 도착하는지 여부입니다. DataTable의 Numcols 열을 자동 인증으로 정의 했으므로 C# 코드에서 예외를 얻을 수 있습니다.

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

<편집>

제출을 클릭했을 때 내가 무엇을했는지 모르겠다 ...

이 경우 DataTable을 생성 할 때 자동 분류를 제외하십시오. 만약 열 데이터 유형 일관성이 있습니다.이 속성은 TVP를 SS 유형과 "동일"하는 것으로 정렬 할 때 중요하지 않습니다.

< /edit>

대신 ParseInputFile 테이블에서 오류가 발생할 수 있습니까? Numcols는 식별 필드로 정의되지만 C# 코드에서 레코드 값을 1로 설정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top