2013-04-03 74 views
0
declare @var varchar(max),@course varchar(max) 
set @var='ABC' 
set @Query='' 
set @Query=' 
select @course=PARAM from TABLE where PARAM='''[email protected]+'''' 
print @Query 
exec (@Query) 

輸出參數值由於上述查詢返回一個錯誤獲取從動態SQL

必須聲明標量變量「@course」

這裏的查詢是我的替代以下是現在讓這個查詢成功。

declare @var varchar(max),@course varchar(max),@Query varchar(max) 
Create table #temp(param1 varchar(max)) 
set @var='ABC' 
set @Query='' 
set @Query='insert #temp(param1) 
select PARAM from TABLE where PARAM='''[email protected]+'''' 
print @Query 
exec (@Query) 
select @course=param1 from #temp 
drop table #temp 

除了上面提到的解決方案之外,還有其他更好的替代方案嗎?

+0

正如你所看到的,我想基於這樣的條件指定從「TABLE」檢索到的值。這裏我使用了exec(@Query),因爲在我的要求中,「TABLE」的名稱是動態的(比如'TABLE_2012','TABLE_2013'),所以我應該動態地形成查詢。 –

+0

TABLE_2012和TABLE_2013聽起來像是一個糟糕的設計決定。爲什麼不在一年的列上分割或聚集單個表格?現在你不需要動態SQL,性能會非常相似,並且模式管理將變得更容易。 –

回答

12

嗯,我不知道你實際上需要在這裏使用動態SQL聲明變量,但我懷疑你簡單化了我們的一個更復雜的例子。 (提示:你不需要這麼做。)

如果這是你在做什麼,那麼爲什麼不乾脆:

SELECT @course = PARAM FROM dbo.Table WHERE PARAM = @var; 

(這甚至沒有意義 - 顧名思義@course@var是等於或行不存在。)

如果您的SQL實際上更復雜,那麼您需要使用EXEC()停止使用並且擁抱sp_executesql。這允許的一個事情是用強類型參數(包括OUTPUT)更靈活。下面是一個簡單的例子:

DECLARE @table_name SYSNAME; 

DECLARE @var VARCHAR(MAX), @course VARCHAR(MAX), @sql NVARCHAR(MAX); 

SELECT @var = 'ABC', @table_name = N'TABLE_2012'; 

SET @sql = N'SELECT @course = PARAM FROM ' + @table_name 
    + ' WHERE PARAM = @var;' 

EXEC sp_executesql @sql, 
    N'@var VARCHAR(MAX),@course VARCHAR(MAX) OUTPUT', 
    @var, @course OUTPUT; 

PRINT @course; 
+0

在我的要求中,「TABLE」的名稱是動態的(比如'TABLE_2012' ,'TABLE_2013'),所以我應該去動態SQL –

-1

您可以在動態查詢本身

declare @var varchar(max) 
set @var='ABC' 
set @Query='' 
set @Query=' 
DECLARE @course varchar(max) 
select @course=PARAM from TABLE where PARAM='''[email protected]+''' 

SELECT @course 
' 
print @Query 
exec (@Query) 

--Reusing variable 
    CREATE TABLE #temp 
    (
     VALUE VARCHAR(MAX) 
    ) 
    INSERT INTO #temp 
    EXEC (@Query) 
    SELECT * FROM #temp 
+0

然後你如何在'EXEC'完成後使用'@ course'的值?這消除了即時錯誤,但它不能解決實際問題。 –

+0

@AaronBertrand我修改了我的答案,是不是沒關係? – brykneval

+2

好吧,現在你已經解決了這個問題,但是創建一個#temp表來保存一個值並不是很有效...... –

1

你可以試試這個

declare @var varchar(max),@course varchar(max),@paramdef varchar(100) 

set @var='ABC' 
set @Query='' 
set @Query=N' 
select @result=PARAM from TABLE where PARAM='''[email protected]+'''' 
set @paramdef=N'@result varhcar(20) OUTPUT' 

execute sp_executesql @Query,@paramdef,@[email protected] Output 

SELECT @course