2016-01-27 205 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來測試非數字值的列,並輸出寫入臨時表。我正在努力想出一套基於集合的方式來做到這一點 - 但是有一組列是一個起點。祝你好運。