C# System.Data.dll中发生“System.Data.SqlClient.SqlException”类型的异常。其他信息:对象名称无效
我正在尝试将数组作为tvp添加到sql server。实际存在的问题是,在存储过程中我调用了一个函数,但当 无效的对象名称“IncrementKeyID”。 我的c代码是这样的:C# System.Data.dll中发生“System.Data.SqlClient.SqlException”类型的异常。其他信息:对象名称无效,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我正在尝试将数组作为tvp添加到sql server。实际存在的问题是,在存储过程中我调用了一个函数,但当 无效的对象名称“IncrementKeyID”。 我的c代码是这样的: public void key_insert(string[] KeyArray, int count) { var keyworddt = new DataTable(); keyworddt.Columns.Add("strKeyword_Name", typeof(s
public void key_insert(string[] KeyArray, int count)
{
var keyworddt = new DataTable();
keyworddt.Columns.Add("strKeyword_Name", typeof(string));
for (int i = 0; i < count;i++ )
keyworddt.Rows.Add(KeyArray[i]);
var parameter = new SqlParameter("@Keyword", SqlDbType.Structured);
parameter.Value = keyworddt;
parameter.TypeName = "dbo.KeyInsertUDT";
using (obj)
{
obj.Database.ExecuteSqlCommand("exec dbo.usp_KeyInsert @Keyword", parameter);
}
}
TVP的创建方式类似于
Create Type KeyInsertUDT as Table
(
strKeyword_Name varchar(30)
)
我创建的函数以及调用该函数的存储过程是:
CREATE FUNCTION dbo.IncrementKeyID
()
RETURNS VARCHAR(11)
as
begin
DECLARE @PK_strKeyword_Id VARCHAR(11);
DECLARE @PreFix VARCHAR(10) = 'KEY';
DECLARE @Id INT;
SELECT @Id = ISNULL(COUNT(PK_strKeyword_Id),0) + 1 FROM Tbl_Keyword
SELECT @PK_strKeyword_Id = @PreFix + RIGHT('' + CAST(@Id AS VARCHAR(7)), 7)
RETURN @PK_strKeyword_Id
END
Create procedure usp_KeyInsert
@Keyword dbo.KeyInsertUDT Readonly
as
Begin
insert into dbo.Tbl_Keyword (PK_strKeyword_Id,strKeyword_Name)
SELECT f1.PK_strKeyword_Id,f2.strKeyword_Name
FROM
(SELECT * FROM IncrementKeyID()) AS f1
CROSS JOIN
(SELECT strKeyword_Name FROM @Keyword) AS f2
End
我知道问题出在存储过程上,但由于我对这个概念不熟悉,所以无法理解错误在哪里。在我的存储过程中,我基本上是试图检索数组值,并将它们存储在关键字表中,为其分配一个唯一的主键。如何调试错误?调用UDF时,需要通过拥有的架构名称-so dbo.IncrementKeyID对其进行限定: 尽管这是一个标量UDF,但您不需要使用SELECT:
但是,看起来您只是以一种糟糕的方式重新实现了IDENTITY,在过程中引入了一种恶劣的竞争条件,使得存储和查询varchar11的成本大大高于使用int。如果可能,只需使用int not null identity1,1列。存储“KEY27”比存储“KEY27”没有任何优势。如果要为键添加前缀:在UI中这样做。在过程中调用函数dbo.incrementKeyId谢谢,是的,这很好,而且我需要使用varchar,所以我正在这样做。但是还有一个问题,当调用insert命令时,主键只增加一次,并且只有该值试图为其他行复制。我如何编写代码,使插入表中的每个tvp值的主键都递增??你能帮我吗?@Amalpriya使用身份栏。对于UDF:由服务器决定何时调用它,除非您使用交叉应用,请不要这样做。坦率地说,我需要使用varchar,这是愚蠢的。对不起,是的。作为一名程序员,你的工作有时是说“不”,这不是一个合适的设计——在这种情况下:它不是。但是,作为一个绝对最坏的情况,您可以创建表Foo u id int not null identity1,1,id为'KEY'+CONVERTvarchar8,u id持久化,关键字varchar30 not null,但请让我澄清一下:这是愚蠢的,我接受了您使用identity列的想法,因为使用varchar比预期的要复杂。无论如何,谢谢你的帮助。使我免于使自己和代码复杂化
CREATE FUNCTION dbo.IncrementKeyID
()
RETURNS VARCHAR(11)
as
begin
DECLARE @PK_strKeyword_Id VARCHAR(11);
DECLARE @PreFix VARCHAR(10) = 'KEY';
DECLARE @Id INT;
SELECT @Id = ISNULL(COUNT(PK_strKeyword_Id),0) + 1 FROM Tbl_Keyword
SELECT @PK_strKeyword_Id = @PreFix + RIGHT('' + CAST(@Id AS VARCHAR(7)), 7)
RETURN @PK_strKeyword_Id
END
Create procedure usp_KeyInsert
@Keyword dbo.KeyInsertUDT Readonly
as
Begin
insert into dbo.Tbl_Keyword (PK_strKeyword_Id,strKeyword_Name)
SELECT f1.PK_strKeyword_Id,f2.strKeyword_Name
FROM
(SELECT * FROM IncrementKeyID()) AS f1
CROSS JOIN
(SELECT strKeyword_Name FROM @Keyword) AS f2
End
SELECT * FROM dbo.IncrementKeyID()
insert into dbo.Tbl_Keyword (PK_strKeyword_Id,strKeyword_Name)
SELECT dbo.IncrementKeyID(), strKeyword_Name
FROM @Keyword