Pergunta

Eu olhei no site da SQLTeam mas agora estou tendo um problema novo porque eu tenho uma coluna de identidade e o seu exemplo não.

Eu tenho SQL Server 2008 e VS 2008. Eu estou tentando executar o InsertPIF SP usando C # e uma mesa de UDT, mas estou recebendo uma exceção. Eu olhei para um site SQLTeam exemplo com uma tabela de UDT, mas seu exemplo não tem uma coluna de identidade como o meu faz.

No entanto, o seu exemplo tabela não tem uma coluna de identidade como o meu. O que estou tentando fazer deve ser simples. Eu tentei muitas variações diferentes deste, mas essencialmente:

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

onde

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

e digite:

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

O que estou tentando fazer é executar o SP acima para inserir novos registros no ParentTable. Exemplo:

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

Aqui está mais do meu código C # antes da secção 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();

I conjunto de identidade para ser ligada pela ParentTable, mas parece que eu tenho que executar este cada sessão, então eu não tenho certeza de como remover exigência de identidade ou então para fazer a identidade permanecerá acesa. Exceção:

INSERT em uma coluna de identidade não é permitido em variáveis ??de tabela. Os dados para o parâmetro com valor de tabela '@InputFileParam' não estão em conformidade com o tipo de tabela do parâmetro.

Como faço para executar este SP?

Foi útil?

Solução

Eu acho que Roland está no caminho certo - as colunas IDENTITY são definitivamente o problema. Desde sua tabela de destino final já tem uma coluna de identidade que será preenchido automagicamente para você, eu recomendaria não especificar a mesma coluna em seu tipo de tabela definido pelo usuário (e também não declarar uma chave primária do tipo de mesa):

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

Em seguida, em seu código C #, basta configurar um DataTable com uma única coluna:

DataTable dt = new DataTable();

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

e em seguida, adicione suas colunas para o seu "dt" DataTable -. Com apenas uma string "strRow"

Em seu proc armazenado que então é chamado com o seu tipo de tabela definido pelo usuário, simplesmente inserir suas cordas:

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

Isso deve fazê-lo, espero! (Não tive o tempo para testar isso mesmo)

Marc

Outras dicas

Ok, eu não tenho realmente trabalhou com TVPs ainda, então eu poderia estar errado - mas da minha leitura, & fundo geral SS, eu pensar seu problema é o seguinte:

A sua mesa permanente tem uma coluna de identidade, então SS quer lidar com isso para você. Você pode definir Identity Insert, mas isso não é uma boa idéia ....

Uma coisa é tentar especificar a coluna para inserir em seu SP:

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

A outra coisa para olhar, como Tim Lentine sugeriu (enquanto eu estava escrevendo esta resposta), é se ou não você está realmente ficando para o servidor. Desde que você tenha definido a coluna NúmColunas em sua DataTable como AutoIncrement, pode ser que você está recebendo sua exceção no código C #, em:

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

Não sei o que eu estava thnking quando eu cliquei Enviar ...

Se for esse o caso, tente deixar de fora o AutoIncrement quando você creat seu DataTable. Se o tipos de dados coluna são consistentes, essa propriedade não deve importar quando alinhando a TVP como sendo "o mesmo" como o Tipo de SS.

Poderia o erro estar vindo de tabela de parseInputFile em vez disso? NúmColunas é definido como um campo de identificar, mas no código C # você está definindo o valor do registro para 1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top