MS SQL Server存储过程参数的隐式类型转换
Microsoft SQL Server 2000数据表的列和存储过程的参数都是有类型的,但我发现在写存储过程时很多参数类型是可以“混用”的,比如,下面的存储过程:
 /*
/*
 Name :    Stp_TestDifferentParaType_INT
 Name :    Stp_TestDifferentParaType_INT
 Function :   测试不同参数类型对存储过程的影响
 Function :   测试不同参数类型对存储过程的影响
 Author :   Waxdoll Cheung
 Author :   Waxdoll Cheung
 Date :    2005-04-07
 Date :    2005-04-07
 */
*/
 
 CREATE PROCEDURE dbo.Stp_TestDifferentParaType_INT
CREATE PROCEDURE dbo.Stp_TestDifferentParaType_INT
 -- 统计年月
  -- 统计年月
 @TongJiNianYue INT
  @TongJiNianYue INT
 AS
AS
 SELECT [FM_产品登记].* FROM [FM_产品登记] WHERE (所属年份 = @TongJiNianYue)
 SELECT [FM_产品登记].* FROM [FM_产品登记] WHERE (所属年份 = @TongJiNianYue) 
 
 RETURN
 RETURN
 GO
GO
 
 
   
和下面的存储过程:
 /*
/*
 Name :    Stp_TestDifferentParaType_CHAR
 Name :    Stp_TestDifferentParaType_CHAR
 Function :   测试不同参数类型对存储过程的影响
 Function :   测试不同参数类型对存储过程的影响
 Author :   Waxdoll Cheung
 Author :   Waxdoll Cheung
 Date :    2005-04-07
 Date :    2005-04-07
 */
*/
 
 CREATE PROCEDURE dbo.Stp_TestDifferentParaType_CHAR
CREATE PROCEDURE dbo.Stp_TestDifferentParaType_CHAR
 -- 统计年月
  -- 统计年月
 @TongJiNianYue CHAR(4)
  @TongJiNianYue CHAR(4)
 AS
AS
 SELECT [FM_产品登记].* FROM [FM_产品登记] WHERE (所属年份 = @TongJiNianYue)
 SELECT [FM_产品登记].* FROM [FM_产品登记] WHERE (所属年份 = @TongJiNianYue) 
 
 RETURN
 RETURN
 GO
GO
 
 
   
在测试存储过程时输出的结果是一样的,而数据列是有类型的——CHAR(4),
为什么呢?应该是存储过程在执行时对参数进行了隐式类型转换。
但写存储过程时确定参数的类型时应该注意:
1、应该尽量使用和数据列类型相同的数据类型,减少运行是的隐式类型转换;
2、不是所有类型都可以进行隐式类型转换的,如果使用不同的数据类型,很可能会发生错误: 
 
图:Microsoft SQL Server数据类型转换图
另外,SQL Server自定义函数的参数也有类似情况。
Life is like a boat, and I'm at sea.

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号