我有一个将数据插入表的过程。我声明要插入到表(输入参数)的值为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
答案 0 :(得分:1)
Sql隐式将你的varchar转换为int,所以我认为你不必担心任何事情,只过滤你的输入,这样你就不会把任何字符串提取到你的程序中,而不能转换成Int和 kaf 建议您-2147483648 and 2147483647
之间的任何事情都不需要担心。
非常感谢接受回答,但我认为你也需要看看这个......
SQL服务器内部使用函数'CONVERT_IMPLICIT'进行转换,当转换发生时, INDEXES 由于结果不确定而无法有效使用function - 这意味着它必须转换每一行的值。这导致SQL Server扫描整个表以查找值。
精美的文章here
答案 1 :(得分:0)
此转换遇到的最大问题是性能。 SQL可以弄清楚你想要使用隐式转换做什么。但是,它将无法充分利用索引和统计数据。
在大型数据集中,没有数据库开始,但成功的数据库通常会成长为,您可能会遇到重大的性能问题。
阅读SQL Server专家Tibor Karaszi撰写的这篇优秀文章:
http://sqlblog.com/blogs/tibor_karaszi/archive/2009/04/28/match-those-types.aspx