Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有datetime输出参数的sp_executesql_Sql_Sql Server_Datetime_Stored Procedures - Fatal编程技术网

带有datetime输出参数的sp_executesql

带有datetime输出参数的sp_executesql,sql,sql-server,datetime,stored-procedures,Sql,Sql Server,Datetime,Stored Procedures,我在SQL Server中遇到了一个问题。我必须使用存储过程sp_executesql,这是一个系统过程,因为我在其上执行select子句的表依赖于其他参数 以下是示例: @p_Origin是我的过程中给出的一个参数,因此为了重现问题,让我们这样声明它: DECLARE @p_Origin nvarchar(255) = 'Sales' 我的SELECT子句中还有一个参数,它们是目标表的列: DECLARE @v_valueVersion as int IF @p_Origin = 'Sal

我在SQL Server中遇到了一个问题。我必须使用存储过程
sp_executesql
,这是一个系统过程,因为我在其上执行select子句的表依赖于其他参数

以下是示例:

@p_Origin
是我的过程中给出的一个参数,因此为了重现问题,让我们这样声明它:

DECLARE @p_Origin nvarchar(255) = 'Sales'
我的
SELECT
子句中还有一个参数,它们是目标表的列:

DECLARE @v_valueVersion as int 
IF @p_Origin = 'Sales'  
    SET @v_valueVersion = (SELECT VersionId FROM Version WHERE ...)
ELSE IF 
    ...
但是现在,我想从我的origin表(这里是
Sales
)返回一列 使用此查询:

DECLARE @v_query as nvarchar(max) = 'SELECT MAX(Date) FROM dbo.' + @p_Origin + ' WHERE VersionId = ' + CAST(@v_valueVersion as nvarchar) + ' AND Month = CONVERT(NVARCHAR(6),GETDATE(),112) '
此列,
date
,是一个
datetime
列,在此处声明:(
Month
列和
date
列是两个不同的东西,它们指的不是同一个期间)

这是我的问题:

EXEC sp_executesql @v_query, N'@v_maxDate datetime out', @v_maxDate out
当我得到这个结果时,
SELECT
子句会给我以下结果,这是一个好结果:

-----------------------
2016-01-19 15:49:58.000
但是当我
PRINT
该值时,不打印任何内容,并且该值为
null
。如何使用此存储过程返回一些日期时间值?有可能吗

编辑:正如Adwaenyth所说,下面的查询工作得非常好:

DECLARE @query nvarchar(max) = 'SELECT  @v_maxDate = MAX(create_date) FROM sys.tables'
DECLARE @v_maxDate datetime

EXEC sp_executesql @query, N'@v_maxDate datetime out', @v_maxDate out

PRINT @v_maxDate
我在查询中使用多个变量是否可能会修改结果

将查询更改为

DECLARE @v_query as nvarchar(max) = 'SELECT @v_maxDate = MAX(DATE) FROM dbo.' + @p_Origin + ' WHERE VersionId = ' + CAST(@v_valueVersion as nvarchar) + ' AND Month = CONVERT(NVARCHAR(6),GETDATE(),112) '
它应该会起作用

/编辑:我自己刚刚尝试了这个特别的查询,效果非常好:

DECLARE @query nvarchar(max) = 'SELECT  @v_maxDate = MAX(create_date) FROM sys.tables'
DECLARE @v_maxDate datetime

EXEC sp_executesql @query, N'@v_maxDate datetime out', @v_maxDate out

PRINT @v_maxDate
准确打印输出:

2016年1月18日下午1:10


也许试着运行上面的查询,看看它是否在您的服务器上运行。。。如果是的话,也许可以再次查看查询的语法。

非常感谢您提供这些信息。我也有同样的问题,这帮我解决了

我的理解是:当使用sp_executesql将查询结果分配给变量时,该变量必须是查询本身的一部分。也就是说,在步骤1({query}=“SELECT Max(Date)FROM{table}…”)中运行查询,然后在步骤2中将输出分配给变量(例如sp_executesql{query},@varOut output)是不可行的。这就是OP最初所做的,也是我最初的方法。相反,查询本身必须在一个步骤中将结果分配给变量:“从{table}中选择@varOut=Max(Date)…”

第一种方法似乎是以“正常”的方式运行查询(即,好像是在命令行手动键入的),因此将结果正常发送到STDOUT。这使得Max(日期)在屏幕上可见,正如OP所看到的。但是输出没有分配给变量。相反,sp_exectuesql必须有某种默认返回的成功/失败指示。这是OP在打印@varOut的值时看到的


再次感谢您的帮助。

谢谢Adwaenyth,我已经尝试了这个,但是我不工作,我的
@v_maxDate
在我尝试打印它时仍然为空。但是我的
SELECT
子句的结果现在在列的顶部有一个名称,即
@v_maxDate
请参见编辑。我自己就试过了,效果很好。。。也许你可以试试上面的简单查询,看看它在你的服务器上是否有效。你是对的,这一个非常有效。。。我不明白为什么它对另一个不起作用!我不知道我是否遗漏了什么,如果没有人对我的情况提出建议,我会很快接受你的答复。。
DECLARE @query nvarchar(max) = 'SELECT  @v_maxDate = MAX(create_date) FROM sys.tables'
DECLARE @v_maxDate datetime

EXEC sp_executesql @query, N'@v_maxDate datetime out', @v_maxDate out

PRINT @v_maxDate