从字符串转换日期 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))
我在 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))