SQL游标循环而不声明变量

时间:2016-01-27 05:41:49

标签: sql-server

我在sql server中有一个平面表(所有列类型都是varchar),它包含200列,其中100列将包含数字值,包括小数。我的要求是循环所有列并检查是否有任何列行包含字母数字或非数字值(例如100a0等)。

为了实现上述场景,在SQL中我们有游标有助于循环但是循环100列我需要声明100个变量并存储值如下所示 在SQL中

CREATE PROCEDURE [dbo].[sp_check_value]
AS

Declare     @col1 nvarchar(10),
            @col2 nvarchar(10),
            @col3 nvarchar(10),
            .
            .
            .
            @col100 nvarchar(10)

Declare mycursor cursor For

  select c1,c2,c3...c100 from temp

OPEN mycursor 
Fetch Next From mycursor Into @col1, @col2,@col3,...,col100

While @@Fetch_Status = 0 Begin

    --some update statment

Fetch Next From mycursor Into @col1, @col2,@col3,...,col100

End -- End of Fetch

Close mycursor
Deallocate mycursor

但是,在oracle的另一边,我们有光标,但有一些更方便的方法来处理上述情况。

在Oracle中

create or replace procedure FooBar
as

cursor mydata is
select dog as d, cat as c, fish as f
  from temp;

begin
  for dr in mydata loop

    UPDATE foo SET dogs = dr.d, cats = dr.c, fishes = dr.f;

  end loop;
end;

那么,任何人都可以帮助我在SQL中实现上述场景而不声明100个变量。

感谢。

1 个答案:

答案 0 :(得分:0)

起点可能是从sys.tables中选择列:

SELECT t.name AS table_name, SCHEMA_NAME(schema_id) AS schema_name, c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID

然后根据列名称,编写动态sql以测试列中的非数字值,并将输出写入临时表。我很难想到基于集合的方法来做到这一点 - 但是拥有一组列是一个起点。祝你好运。