3
declare @var varchar(max),@course varchar(max)
set @var='ABC'
set @Query=''
set @Query='  
select @course=PARAM from TABLE where PARAM='''+@var+''''
print @Query
exec (@Query)

上記のクエリはエラーを返すため、

スカラー変数「@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='''+@var+''''
print @Query
exec (@Query)
select @course=param1 from #temp
drop table #temp

上記の解決策以外に、これに代わるより良い方法はありますか?

4

3 に答える 3

24

ここで実際に動的 SQL を使用する必要があるかどうかはわかりませんが、より複雑な例を説明したのではないかと思います。(ヒント: その必要はありません。)

これがあなたがやっていることのすべてであるなら、なぜただではないのですか:

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

@course(意味さえありません-定義により@var、等しいか、行が存在しません。)

EXEC()SQL が実際にはもっと複雑な場合は、使用をやめて受け入れる必要がありますsp_executesql。これにより可能になることの 1 つは、厳密に型指定されたパラメーター ( を含む) の柔軟性が大幅に向上することです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;
于 2013-04-03T11:45:46.437 に答える
4

これを試すことができます

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='''+@var+''''
set @paramdef=N'@result varhcar(20) OUTPUT'

execute sp_executesql @Query,@paramdef,@result=@course Output

SELECT @course
于 2013-04-03T11:54:38.850 に答える
-1

動的クエリ自体で変数を宣言できます

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

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

--Reusing variable
    CREATE TABLE #temp
    (
        VALUE VARCHAR(MAX)
    )
    INSERT INTO #temp
    EXEC (@Query)
    SELECT * FROM #temp
于 2013-04-03T11:45:31.940 に答える