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

Sql server sql server中从字符串到int的隐式数据转换,sql-server,Sql Server,我有一个向表中插入数据的过程。我将要插入表(输入参数)的值声明为Varchar类型。但表中2列的列类型已更改为Int类型。但这个过程仍然正确地插入了值。(在基础表IssuerGroupIDMapping中,列IssuerId和雇主Id是int类型。) 对我来说重要的问题是,在某些特定的场景中,这个过程会失败吗?我已经签入了C#,以便只将有效的整数传递给proc。 我是否需要立即更改代码(这对我来说有点问题,因为这个过程已经在生产中,并且似乎正在工作)。请建议 以下是我的程序代码: CREATE

我有一个向表中插入数据的过程。我将要插入表(输入参数)的值声明为Varchar类型。但表中2列的列类型已更改为Int类型。但这个过程仍然正确地插入了值。(在基础表IssuerGroupIDMapping中,列IssuerId和雇主Id是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

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

Sql隐式地将您的varchar转换为int,因此我认为您不必担心任何事情,只需过滤您的输入,这样您就不会向您的过程中获取任何无法转换为int的字符串,正如kaf所建议的
-2147483648和2147483647
之间的任何内容,您不需要担心

谢谢你接受我的回答,但我想你也需要看看这个

SQL server在内部使用函数“CONVERT\u IMPLICIT”进行转换,当转换发生时,由于函数结果的不确定性,索引不能有效使用,这意味着它必须转换每一行的值。这将导致SQL Server扫描整个表以查找值

精品


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

Sql隐式地将您的varchar转换为int,因此我认为您不必担心任何事情,只需过滤您的输入,这样您就不会向您的过程中获取任何无法转换为int的字符串,正如kaf所建议的
-2147483648和2147483647
之间的任何内容,您不需要担心

谢谢你接受我的回答,但我想你也需要看看这个

SQL server在内部使用函数“CONVERT\u IMPLICIT”
进行转换,当转换发生时,由于函数结果的不确定性,索引不能有效使用,这意味着它必须转换每一行的值。这将导致SQL Server扫描整个表以查找值

精品


此转换将遇到的最大问题是性能。SQL可以找出您试图用隐式转换做什么。然而,它将无法充分利用索引和统计数据

在一个大型数据集中,没有一个数据库是从一开始就存在的,但成功的数据库通常会扩展到这个数据集中,您可能会遇到重大的性能问题

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


此转换将遇到的最大问题是性能。SQL可以找出您试图用隐式转换做什么。然而,它将无法充分利用索引和统计数据

在一个大型数据集中,没有一个数据库是从一开始就存在的,但成功的数据库通常会扩展到这个数据集中,您可能会遇到重大的性能问题

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


确保为这些参数传递一个介于-2147483648和2147483647之间的数字。其他任何东西都会崩溃。我无法想象在SP param声明中将“varchar(x)”替换为“int”会更有效。这是非常非常低的风险,如果我在您描述的情况下传递了Genuine varchar,我肯定希望SP抛出一个错误。您甚至可以在插入之前在SP中将varchar参数显式强制转换为int,并使用TRY/CATCH处理任何转换错误。您可能还想了解
MERGE
statement@user2159471请检查更新的答案,我得到了一些对您当前的情况或将来的参考有用的信息。请确保为这些参数传递一个介于-2147483648和2147483647之间的数字。其他任何东西都会崩溃。我无法想象在SP param声明中将“varchar(x)”替换为“int”会更有效。这是非常非常低的风险,如果我在您描述的情况下传递了Genuine varchar,我肯定希望SP抛出一个错误。您甚至可以在插入之前在SP中将varchar参数显式强制转换为int,并使用TRY/CATCH处理任何转换错误。您可能还想了解
MERGE
statement@user2159471请检查更新后的答案,因为我得到了一些对您当前情况有用的信息,或可供将来参考。