2013-09-27 47 views
1

我有一個向表中插入數據的過程。我聲明瞭要作爲Varchar類型插入到表(輸入參數)的值。但表中2列的列類型已更改爲Int類型。但是程序仍然正確地插入值(IssuerId和Employer Id列在底層表IssuerGroupIDMapping中是int類型)。 對於我來說重要的問題是在某些特定情況下程序會失敗,我已經檢查了C#,以便只有有效的整數傳遞給proc。 我是否需要立即更改代碼(對於我來說,由於程序已經在生產中,並且似乎正在工作中)。請建議。SQL Server中從字符串到int的隱式數據轉換

下面是我的程序代碼:

CREATE PROCEDURE [uspInsertIssuerGroupIDMapping] 
@EmployerID Varchar(25),  
@IssuerID Varchar(25), 
@PlanID Varchar(25),  
@IssuerGroupID Varchar(25), 
@CreateUserID Varchar(25) 

*****/ 
AS 

BEGIN TRY 

    SET NOCOUNT ON 
    SET XACT_ABORT ON 

    --check to see if a duplicate trigger exists 
    IF (NOT EXISTS (SELECT 1 FROM [IssuerGroupIDMapping] 
          WHERE EmployerId = @EmployerID AND PlanId = @PlanID) 
        ) 

    BEGIN 


     INSERT INTO [IssuerGroupIDMapping] 
       ([EmployerId] 
       ,[IssuerId] 
       ,[PlanId] 
       ,[IssuerGroupID] 
       ,[CreateUserId] 
       ,[CreateDate] 
       ,[UpdateUserId] 
       ,[UpdateDate] 
       ) 
     VALUES 
       ( 
       @EmployerID 
       ,@IssuerID 
       ,@PlanID 
       ,@IssuerGroupID 
       ,@CreateUserId 
       ,(SELECT Framework.udfGetTimeTravelDate()) 
       ,@CreateUserId 
       ,(SELECT Framework.udfGetTimeTravelDate()) 
       ); 

       SELECT @@ROWCOUNT; 
     END 
     ELSE 
     BEGIN 
      --if a duplicate record exists update it 
      UPDATE [IssuerGroupIDMapping] SET 
           IssuerId = @IssuerID 
           ,IssuerGroupID = @IssuerGroupID 
           ,UpdateDate = (SELECT Framework.udfGetTimeTravelDate()) 
           ,UpdateUserId = @CreateUserID 

      WHERE EmployerId = @EmployerID 
            AND PlanId = @PlanID 

      SELECT @@ROWCOUNT; 

     END 
+1

確保你傳遞一個*號* -2147483648之間*和* 2147483647這些參數。其他任何東西都會崩潰。 – Kaf

+0

我無法想象在SP參數聲明中將「varchar(x)」替換爲「int」效率更高的場景。這是非常低的風險,如果我在你描述的情況下通過一個genuuine varchar,我肯定會希望SP引發一個錯誤。在插入TRY/CATCH並處理任何轉換錯誤之前,您甚至可以在SP中明確地將varchar參數強制轉換爲int。 –

+0

您可能還想了解MERGE語句 – podiluska

回答

1

SQL允許您通過您鑄造VARCHAR到int類型,但是一個更好的建議是,這樣做是爲了做你的前端一些驗證,使任何不想要的價值不要在你的查詢中產生任何問題(因爲它已經在Prod中了,我希望你已經處理好了)。

Sql隱式地將你的varchar轉換爲int,所以我不認爲你必須擔心任何事情,但過濾你的輸入,以便你不會獲取任何字符串到你的過程,不能轉換爲Int和kaf-2147483648 and 2147483647之間建議了任何你不需要擔心的事情。

好感謝您接受的答案,但我認爲你需要看看這個也..

SQL服務器內部使用功能「CONVERT_IMPLICIT」做轉換和發生轉換時的指標不由於函數結果中涉及的不確定性,這意味着它必須轉換每行的值。這導致SQL Server掃描整個表尋找值。

罰款文章here

MSDN

0

,你會用這種轉換碰到的最大的問題是性能。 SQL可以弄清楚你想用隱式轉換來做什麼。但是,它將無法充分利用索引和統計信息。

在大數據集中,沒有數據庫作爲成功數據的通常會成長爲,您可能會遇到主要的性能問題。

閱讀由SQL Server專家蒂博爾Karaszi這個優秀的文章:

http://sqlblog.com/blogs/tibor_karaszi/archive/2009/04/28/match-those-types.aspx

相關問題