2016-01-20 53 views
1

我在SQL Server中遇到了一個問題。我必須使用存儲過程sp_executesql這是一個系統過程,因爲我做select子句的表取決於另一個參數。帶日期時間輸出參數的sp_executesql

下面是示例:

@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 
    ... 

但現在,我想從我的原始表中取回一列,(whi CH是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柱是兩個不同的東西,他們不指同一時期)

DECLARE @v_maxDate as datetime 

這裏是我的問題:

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 

難道是我在查詢中使用多個變量的事實改變了結果?

回答

2

查詢更改爲

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 PM

也許試着運行上面的查詢,看看它是否在你的服務器上運行......如果有,可能再次查看你的查詢語法。

+0

謝謝Adwaenyth,我試過這個,但是我沒有工作,當我嘗試打印它時,我的'@ v_maxDate'仍然是空的。但是,我的'SELECT'子句的結果現在在列的頂部有一個名字,即'@ v_maxDate' –

+0

請參閱編輯。只是自己試了一下,它的工作...也許嘗試在那裏簡單的查詢,並檢查是否可以在您的服務器上工作。 – Adwaenyth

+0

你是對的,這個完美的作品...我不明白爲什麼它不適用於另一個! –