我在WindowsServer2008R2/IIS上使用Server 2008 R2和经典ASP。我知道经典的ASP在牙齿上很长,但是它与我正在使用的存储过程工作得很好。我有一个存储过程,它可以对smalldatetime列进行简单的更新,但我现在正尝试使用可变表名使这个过程成为一个动态过程。
正常工作的标准程序是:
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将表名作为变量传递时,我就遇到麻烦了。
这是动态过程:
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管理工作室的查询编辑器中运行正常,但是当通过IIS/经典ASP执行时,它会失败,出现以下错误:
从字符串转换日期和/或时间时,转换失败
执行存储过程时。
这是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任何想法和帮助都将不胜感激.谢谢!
发布于 2015-01-06 14:31:56
由于您正在构建一个动态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))https://stackoverflow.com/questions/27800643
复制相似问题