2015-04-22 57 views
2

我想補充一個數組作爲TVP到SQL Server。問題確實存在,我在存儲過程中調用了一個函數,但錯誤出現爲 「無效的對象名'IncrementKeyID'」。 我的C#代碼是這樣的:的類型「System.Data.SqlClient.SqlException」的異常出現在System.Data.dll中其他信息:無效的對象名稱

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

我創建的表作爲

CREATE TABLE dbo.Tbl_Keyword 
    (
    PK_strKeyword_Id varchar(11) not null, 
    strKeyword_Name varchar(30) not null, 
    PRIMARY KEY (PK_strKeyword_Id) 
    ); 

的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 

我知道問題在於存儲過程,但由於我對這個概念很陌生,我無法理解錯誤在哪裏。在我的存儲過程中,我基本上試圖檢索數組值,並將它們存儲在關鍵字表中爲其分配唯一主鍵。我如何調試錯誤?

+1

呼叫你的程序爲'dbo.IncrementKeyID()' – ughai

回答

1

當你調用需要由所屬的架構的名稱要符合他們的UDF - 所以dbo.IncrementKeyID()

SELECT * FROM dbo.IncrementKeyID() 

雖然因爲這是一個標量UDF,你並不需要使用SELECT

insert into dbo.Tbl_Keyword (PK_strKeyword_Id,strKeyword_Name) 
SELECT dbo.IncrementKeyID(), strKeyword_Name 
FROM @Keyword 

但是,看起來你只是以一種糟糕的方式重新實施了IDENTITY,在這個過程中引入了令人討厭的競爭條件,並且使存儲和查詢的成本更高(varchar(11)比w更昂貴ork與int)。如果可能,只需使用int not null identity(1,1)列。在存儲'KEY27'而不是27中沒有任何優勢。如果你想在鍵前綴:在UI中做。

+0

感謝功能,是的,這工作得很好,也是我需要使用VARCHAR,所以我做的這樣。但是還有另外一個問題,當調用insert命令時,主鍵僅增加一次,並且只有該值試圖爲其他行重複。我怎樣才能編寫一個代碼,以便插入表主鍵的每個tvp值都增加?你能幫助我嗎? – Amalpriya

+0

@Amalpriya通過使用**標識列**。在UDF的情況下:服務器決定何時調用它(除非使用交叉應用,請不要這樣做)。你的「我需要使用varchar」坦率地說:愚蠢。對不起,但是。你作爲程序員的工作有時會說「不,這不是一個合適的設計」 - 在這種情況下:它不是。但是,作爲絕對最差的情況,你可以像'create table Foo(__id int not null identity(1,1),Id as'KEY'+ CONVERT(varchar(8),__id)那樣做一些事情,PERSISTED,Keyword varchar(30)非空)',但請讓我明白:那是愚蠢的 –

+0

最後,我介紹了使用身份列的想法,因爲使用varchar變得比預期複雜。無論如何感謝您的幫助。從複雜的自己和代碼中拯救了我 – Amalpriya

相關問題