簡體   English   中英

動態 SQL 存儲過程和日期時間

[英]Dynamic SQL stored procedure and datetime

我有一個簡單的查詢,我想將其轉換為動態 SQL。 我有 2 個輸入參數:一個表格和一個日期時間。 output 是表的行數和這個特定的日期時間。

CREATE PROCEDURE [etl].[ROWCOUNT_TST2]
    (@P_LOAD_TARGET nvarchar(250),
     @P_LOAD_DATE DATETIME)
AS
BEGIN
    DECLARE @SQL nvarchar(1000)

    SET @SQL = 'SELECT COUNT(*) as Inserted FROM'+@P_LOAD_TARGET +' WHERE VALID_FROM ='''+  @P_LOAD_DATE+''' AND VALID_TO IS NULL'

    EXEC  (@SQL)
END;
GO

我嘗試了不同的解決方案。 我嘗試使用執行sp_executesql進行查詢,我綁定在@P_LOAD_DATE之前和之后添加'''。 我可能在這里遺漏了一些東西。

當我使用表名和日期時間(如2021-05-06 06:41:52.557 )執行存儲過程時,出現以下錯誤:

從字符串轉換日期和/或時間時轉換失敗。

但為什么?

我什至嘗試像這樣添加對日期時間的轉換,但我仍然遇到同樣的錯誤。

 SET @SQL = 'SELECT COUNT(*) as Inserted FROM'+@P_LOAD_TARGET +' WHERE VALID_FROM = convert(datetime,'''+  @P_LOAD_DATE+''') AND VALID_TO IS NULL'

但是當我執行 SELECT convert(datetime, '2021-05-06 06:41:52.557') 它工作正常。 我現在很困惑,找不到問題的根源。

編輯: valid_from是目標表中的日期時間。 所以這也不是問題的原因

您需要正確安全地注入您的動態 object 名稱並參數化您的參數:

CREATE PROCEDURE [etl].[ROWCOUNT_TST2](@P_LOAD_SCHEMA sysname = N'dbo', --Always define your schema
                                       @P_LOAD_TARGET sysname, --sysname is the data type for objects, a synonym of nvarchar(128) NOT NULL
                                       @P_LOAD_DATE datetime) AS
BEGIN

    DECLARE @SQL nvarchar(MAX),
            @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

    SET @SQL = N'SELECT COUNT(*) AS Inserted' + @CRLF +
               N'FROM ' + QUOTENAME(@P_LOAD_SCHEMA) + N'.' + QUOTENAME(@P_LOAD_TARGET) + @CRLF +
               N'WHERE VALID_FROM = @P_LOAD_DATE' + @CRLF +
               N'  AND VALID_TO IS NULL;';

    --PRINT @SQL; --Your best friend.
    EXEC sys.sp_executesql @SQL, N'@P_LOAD_DATE datetime', @P_LOAD_DATE;

END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM