动态 SQL 存储过程和日期时间
Dynamic SQL stored procedure and datetime
我有一个简单的查询,我想将其转换为动态 SQL。我有 2 个输入参数:一个 table 和一个日期时间。输出是 table 和这个特定日期时间的行数。
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
我尝试了不同的解决方案。我尝试使用 execute sp_executesql
进行查询,我在 @P_LOAD_DATE
前后添加了 '''。我可能在这里遗漏了一些东西。
当我执行具有 table 名称和日期时间(如 2021-05-06 06:41:52.557
)的存储过程时,出现以下错误:
Conversion failed when converting date and/or time from character string.
但是为什么呢?
我什至尝试像这样向日期时间添加转换,但我仍然遇到同样的错误。
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
是目标 table 中的日期时间。所以这也不是问题的原因
您需要正确安全地注入您的动态对象名称和参数化您的参数:
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;
我有一个简单的查询,我想将其转换为动态 SQL。我有 2 个输入参数:一个 table 和一个日期时间。输出是 table 和这个特定日期时间的行数。
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
我尝试了不同的解决方案。我尝试使用 execute sp_executesql
进行查询,我在 @P_LOAD_DATE
前后添加了 '''。我可能在这里遗漏了一些东西。
当我执行具有 table 名称和日期时间(如 2021-05-06 06:41:52.557
)的存储过程时,出现以下错误:
Conversion failed when converting date and/or time from character string.
但是为什么呢?
我什至尝试像这样向日期时间添加转换,但我仍然遇到同样的错误。
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
是目标 table 中的日期时间。所以这也不是问题的原因
您需要正确安全地注入您的动态对象名称和参数化您的参数:
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;