我在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个变量。
感谢。
答案 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以测试列中的非数字值,并将输出写入临时表。我很难想到基于集合的方法来做到这一点 - 但是拥有一组列是一个起点。祝你好运。