在sql server中从字符串到int的隐式数据转换

时间:2013-09-27 13:26:03

标签: sql-server

我有一个将数据插入表的过程。我声明要插入到表(输入参数)的值为Varchar类型。但是表中2列的列类型已更改为Int类型。但仍然是过程正在正确插入值。(IssuerId和Employer Id列是基础表IssuerGroupIDMapping中的int类型。) 对我来说重要的问题是在某些特定情况下程序会失败,我已经在C#中检查,以便只有有效的整数传递给proc。 我是否需要立即更改代码。(因为程序已经在生产中并且似乎正在运行,因此对我来说有点问题。)。请建议。

以下是我的程序代码:

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

2 个答案:

答案 0 :(得分:1)

SQL允许你通过将varchar转换为int类来实现这一点。但是,更好的建议是在前端进行一些验证,这样任何不需要的值都不会在查询中产生任何问题(因为它在Prod中。我希望你已经照顾好了。)。

Sql隐式将你的varchar转换为int,所以我认为你不必担心任何事情,只过滤你的输入,这样你就不会把任何字符串提取到你的程序中,而不能转换成Int和 kaf 建议您-2147483648 and 2147483647之间的任何事情都不需要担心。

非常感谢接受回答,但我认为你也需要看看这个......

SQL服务器内部使用函数'CONVERT_IMPLICIT'进行转换,当转换发生时, INDEXES 由于结果不确定而无法有效使用function - 这意味着它必须转换每一行的值。这导致SQL Server扫描整个表以查找值。

精美的文章here

MSDN

答案 1 :(得分:0)

此转换遇到的最大问题是性能。 SQL可以弄清楚你想要使用隐式转换做什么。但是,它将无法充分利用索引和统计数据。

在大型数据集中,没有数据库开始,但成功的数据库通常会成长为,您可能会遇到重大的性能问题。

阅读SQL Server专家Tibor Karaszi撰写的这篇优秀文章:

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