【问题标题】:Datetime and sp_executesql日期时间和 sp_executesql
【发布时间】:2012-06-15 19:01:39
【问题描述】:

这是我遇到datetime 问题的 T-SQL 代码

打开@form_dates
从@form_dates 获取下一个到@cid、@regdate、@compdate

/* 打印@regdate 打印@compdate 这在日期时间中正确具有值。例如:2012 年 3 月 28 日下午 6:03 打印@courseno */

WHILE @@FETCH_STATUS = 0 开始 设置@SQL = N'update tblname set cs' + CAST (@cid AS VARCHAR(10)) + '_begin = @rstring, cs' + CAST (@cid AS VARCHAR(10))+ '_end = @cstring where UserID = '+ CAST (@tempID AS VARCHAR(10))

声明@ParmDefinition nvarchar(500) SET @ParmDefinition = N'@rstring 日期时间,@cstring 日期时间'

执行 sp_ExecuteSQL @SQL,@ParmDefinition, @rstring = @regdate,@cstring = @compdate I have the values of @regdate and @compdate fetched from a cursor and are of the format Jan 3 2012 2:30PM Mar 28 2012 6:03PM but these values are not reflecting in procedure output where I get the output:

更新 tblname 设置 cs32_begin = @rstring , cs32_end = @cstring 其中 UserID = 419

谢谢。^

【问题讨论】:

  • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法突出显示它!
  • 请显示@SQL, @regdate and @compdate的定义,并说明光标和值的来源。您要求我们解决这个完全盲目的问题。
  • 当你简化时会发生什么(例如我给出的例子,你只是SELECT)?我也不明白您所说的“这些值没有反映在过程输出中”是什么意思 - 您究竟是如何在代码示例的最后一行获得输出的?你在用PRINT @SQL吗?如果是这样,请记住,@SQL 不会在您使用 sp_executeSQL 后替换字符串中的值。

标签: sql-server database sql-server-2008 tsql dynamic-sql


【解决方案1】:

这与数据类型、日期时间或光标无关。这只是草率不一致的变量命名。在外面你叫他们:

@regstring
@compstring

你在里面叫他们:

@rstring
@cstring

所以试着保持一致,不管怎样:

SET @SQL = N'update tblname set cs' + CAST (@cid AS VARCHAR(10)) 
+ '_begin = @rstring , cs' + CAST (@cid AS VARCHAR(10))
+ '_end = @cstring where UserID = '+ CAST (@tempID AS VARCHAR(10))

DECLARE @ParamDefinition nvarchar(500)
SET @ParamDefinition = N'@rstring datetime, @cstring datetime'

EXECUTE sp_ExecuteSQL @SQL, @ParamDefinition, 
@rstring = @regdate, @cstring = @compdate
^^-------------------^^

编辑

这对我来说很好用:

DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'SELECT _begin = @rstring , _end = @cstring;';

DECLARE @ParmDefinition nvarchar(500)
SET @ParmDefinition = N'@rstring datetime, @cstring datetime'

DECLARE @regdate DATETIME = GETDATE(), @compdate DATETIME = DATEADD(DAY, 1, GETDATE());

EXECUTE sp_ExecuteSQL @SQL, @ParmDefinition, 
@rstring = @regdate, @cstring = @compdate;

结果:

_begin                   _end
-----------------------  -----------------------
2012-06-13 10:28:47.657  2012-06-14 10:28:47.657

我看不出你的输出仍然包含文字“@rstring”并且没有被参数正确替换,除非你仍然有拼写或其他变量名不一致。我怀疑这个查询比您向我们展示的内容更多。

【讨论】:

  • 感谢您的回复。我不小心发布了不一致的代码。但它也不适用于正确的参数。
  • @RohanWarkad 太好了,您能否修复您问题中的代码示例,并向我们展示您现在收到的输出?
  • 我一直在输出 code update tblname set cs30_begin = @rstring , cs30_end = @cstring where UserID = 275 code 当我实际上期待 code @rstring; @cstring code 拥有各自的变量值
  • @RohanWarkad 更新问题。没有人愿意尝试破译评论中的代码示例。
  • @RohanWarkad 请停止尝试更新我的答案。 更新您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2013-06-16
  • 2020-10-19
相关资源
最近更新 更多