0

データを取得して @data_table にフェッチするカーソルがあります。次に、while ループで、その @data_table を別のカーソル (テーブル名として) に渡して、さらに処理を実行します。@data_table の宣言エラーが発生し続けます。これを修正するにはどうすればよいですか?

DECLARE @var_name varchar(50)
DECLARE @data_table varchar(50)
DECLARE @data_value varchar(50)

DECLARE curDiscreteVars CURSOR LOCAL

FOR SELECT DISTINCT v.var_name, v.data_table 
    FROM dbo.vars v
    GROUP BY v.var_name, v.data_table

-- Loop through cursor, translating variable values as needed, and generate counts for each val_code for a variable
OPEN curDiscreteVars
FETCH NEXT FROM curDiscreteVars 
    INTO @var_name, @data_table

WHILE @@FETCH_STATUS  = 0
BEGIN
    --loop through all possible data values

    DECLARE curValues CURSOR LOCAL

    FOR SELECT DISTINCT @var_name  
        FROM @data_table

    OPEN curValues
    FETCH NEXT FROM curValues 
        INTO @data_value

    WHILE @@FETCH_STATUS  = 0
    BEGIN
        print @var_name



        FETCH NEXT FROM curValues 
        INTO @data_value
    END

    CLOSE curValues
    DEALLOCATE curValues

    FETCH NEXT FROM curDiscreteVars 
    INTO @var_name, @data_table
END

CLOSE curDiscreteVars
DEALLOCATE curDiscreteVars
4

2 に答える 2

1

私としては、カーソルが好きではありません! 私にとってカーソルは悪です。あなたが望まないロックなどを与えてください。私がいつもしているのは、値を含む一時テーブルを作成し(通常はカーソルに挿入するように)、whileループでループすることです

このような :

declare @currow int
      , @totrow int

create table #tmp_values (id int identity(1, 1), val int)

insert 
into   #tmp_values
select val
from   tableX

set @totrow = @@rowcount
set @currow = 1

while @totrow > 0 and @currow <= @totrow
begin
  select @val = val
  from   #tmp_values
  where id = @currow

  set @currow = @currow + 1
end

そうすれば、物事をより細かく制御でき、tmp テーブルを再利用できます

于 2012-10-27T07:32:48.053 に答える
0

何を言っているのかよくわかりませんが、変数をテーブル名として使用することはできません。または、実際にはフィールド名ではないもの。動的 SQL を使用する必要があります。つまり、SQL 文字列を変数に割り当ててから、EXEC()コマンドを実行します。

例えば:

 DECLARE @sqlcmd varchar(max)
 DECLARE @table_name sysname

 DECLARE cur_tables FOR
 SELECT name FROM sys.tables

 OPEN cur_tables
 FETCH NEXT FROM cur_tables INTO @table_name

 WHILE @@FETCH_STATUS = 0 BEGIN
 SET @sqlcmd = 'SELECT TOP 10 * FROM ' + QUOTENAME(@table_name)
 EXEC ( @sqlcmd )
 FETCH NEXT from cur_tables INTO @table_name
 END

 CLOSE cur_tables
 DEALLOCATE cur_tables

または、テーブルのようなデータを格納する場所が必要な場合は、一時テーブルを作成します。

于 2012-10-27T03:21:08.640 に答える