TSQL VarChar を暗黙的に SmallDateTime に変換
-
21-08-2019 - |
質問
返された結果に対して smalldatetime 制約を使用して以下を実行すると、結果はゼロになります。
Execute sp_proc @DateOfBirth = '01/01/1900'
または
Execute sp_proc @DateOfBirth = '1900-01-01'
しかし、次の varchar 引数を使用すると、突然 2000 年 1 月 1 日に対応する結果が得られます。smalldatetime の暗黙的な変換は mm/dd/YYYY 日付では機能せず、mm/dd/YY 日付のみでは機能しませんか?
Execute sp_proc @DateOfBirth = '01/01/00'
これにより、2000 年 1 月 1 日の誕生日に関するすべての結果が返されます。
CREATE PROCEDURE [dbo].[sp_proc]
-- Add the parameters for the stored procedure here
@DateOfBirth SmallDateTime = null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT *
FROM
view_People
WHERE
FirstName LIKE '%' + IsNull(@FName ,FirstName) + '%'
AND
LastName LIKE '%' + IsNull(@LName,LastName) + '%'
AND
DOB = IsNull(@DateOfBirth,DOB)
AND
SSN = IsNull(@SSN,SSN)
解決
「01/01/00」は「」に基づいて変換されます。2 桁の年区切り" オプション。したがって、2000 年 1 月 1 日になります。
「1900-01-01」を送信すると、コードは DOB = 01 Jan 1900 の場合にのみ結果を取得することを示します。
それ以外は、宣伝どおりに機能しています。走りたくなければ Execute sp_proc @DateOfBirth = DEFAULT
DOB を強制的に無視するには
他のヒント
技術的には、次の出力を比較する必要があります。
Execute sp_proc @DateOfBirth = '01/01/00'
に:
Execute sp_proc @DateOfBirth = '01/01/2000'
または
Execute sp_proc @DateOfBirth = '2000-01-01'
YYYYMMDD (ダッシュなし) のような安全な形式を使用してください
これらも実行して何が起こるかを確認してください
select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)
所属していません StackOverflow