从字符串转换日期 and/or 时间时遇到 SQL Server 2008 R2 转换失败

Stumped on SQL Server 2008 R2 Conversion failed when converting date and/or time from character string

我在 Windows Server 2008 R2/IIS 上使用 SQL Server 2008 R2 with Classic ASP。我知道经典的 ASP 已经很老套了,但它与我正在使用的存储过程配合得很好。我有一个对 smalldatetime 列进行简单更新的存储过程,但我现在正尝试使用变量 table 名称使该过程成为动态过程。

正常运行的标准程序是:

CREATE PROCEDURE [dbo].[spendemerg]
(
  @rfid int
)
AS
BEGIN
   SET NOCOUNT ON;

   Update EmergencyContent 
   Set content_expiry = DATEADD(minute, -10, GETDATE())
   Where content_id = @rfid
END

我正在使用 ADO 传递可变参数 @rfid,它工作正常。当我尝试更改程序以使用动态 SQL 将 table 名称作为变量传递时,我遇到了麻烦。

这是动态过程:

ALTER PROCEDURE [dbo].[spendBroadcast]
    @rfid int,
    @strTable varchar(100)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @SQL nvarchar(MAX);

    SET @SQL = 'UPDATE ' + @strTable + 
               ' SET content_expiry = '''+ CONVERT(datetime,(DATEADD(minute, -10, GETDATE())), 121) +
               ''' WHERE content_id = '+ @rfid
    EXEC(@SQL)
END

代码在使用 SQL management studio 的查询编辑器中运行正常,但是当通过 IIS/CLassic ASP 执行时,它失败并出现错误:

Conversion failed when converting date and/or time from character string

执行存储过程时。

这是 ASP 代码:

Set objCm = Server.CreateObject("ADODB.Command")
Set objRe = Server.CreateObject("ADODB.Recordset")

  objCm.ActiveConnection = objConn
  objCm.CommandText = "spendBroadcast"
  objCm.CommandType = adCmdStoredProc


Set objParam = objCm.CreateParameter("rfid",adInteger,adParamInput,4, strID)
  objCm.Parameters.Append objParam
Set objParam = objCm.CreateParameter("strTable",adVarChar,adParamInput,100, strTableName)
 objCm.Parameters.Append objParam

Set objRe = objCm.Execute

任何想法和帮助将不胜感激...谢谢!

由于您正在构建一个动态 SQL 字符串,因此所有内容都应该是相同的数据类型(请注意下面添加的 2 个转换):

SET @SQL = 'UPDATE ' + @strTable + ' SET content_expiry = '''
            + cast(CONVERT(datetime,(DATEADD(minute,-10,GETDATE())),121) as nvarchar(100))
            +''' WHERE content_id = ' + cast(@rfid as nvarchar(100))