2016-01-27 212 views
0

我有一个平坦的表(所有列类型是varchar)在SQL服务器中包含200列,其中100列将有数值包括小数。我的要求是循环所有列,并检查是否有任何列行包含字母数字或非数字值(例如100a0等)。SQL游标循环未声明变量

为了实现上述情况下,在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个变量。

谢谢。

+2

在解决游标中的变量问题之前,首先确定是否需要游标。你可能能够以基于集合的方式做到这一点。 –

+0

@FelixPamittan,只是为了添加更多信息,DB表中的数据将从excel文件中填充,并且具有excel文件的行号。因此,如果任何列行具有非数字值,那么我需要使用行号登录表。我认为,这里需要循环。 – Prathyush

+0

像你写的那样......你只是循环行......而不是列。你需要更新包含字母数字或非数字值的列吗? – danvasiloiu

回答

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来测试非数字值的列,并输出写入临时表。我正在努力想出一套基于集合的方式来做到这一点 - 但是有一组列是一个起点。祝你好运。