Tema: Re: Vėl užsiciklinau su SQL
Autorius: Jornada Del Muerto
Data: 2011-05-24 16:10:02
"NicMC" <jzs@freemail.lt> wrote in message news:irg9e9$s2m$1@trimpas.omnitel.net...
> On 2011.05.24 15:34, Jornada Del Muerto wrote:
>> Ka tu ten konkreciau sukt nori ?
> 
> Yra N lentelių, su vienoda struktūra, kiekvieną iš jų reikia perrinkti 
> paįrašiui. Tiesiog nenoriu copy/paste kodo su kitais lentelių vardais, 
> galvoju kaip prasisukt, kad pavadinimus į kažkur sukišt ir paskui 
> tiesiog iteruoti procedūrą...

    Aisku, tik tiek kad kursoriai ner geriausias variantas del performance, nors jei cia siaip kazkoks vienkartinis paklausimas tai tada dzin. 

    Norint tapacia MSSQL uzklausa be copy paste prasukt keliom tokios pat strukturos lentom prireiks ne vien kursoriaus o dar ir injekcijos - tam kad vis kitoki lentos pavadinima padavineti.

    Butu kazkas tokio gal:

-- Sukuriu lenta is kur imami lentu pavadinimai, cia gali kaip tau noresis pasidaryti, sukurt paprasta lenta ar dar kazka
-- veiks nuo MSSQL 2005 ir aukstesnio, tik nuo MSSQL 2005 galima deklaruoti lenta kaip kintamaji, o tai visgi greiciau nes bus laikoma RAM, o ne HDD

DECLARE @tables table ( name varchar(100))    Insert into     @tables (name) values ('tbl_lenta1')
Insert into     @tables (name) values ('tbl_lenta2')
Insert into     @tables (name) values ('tbl_lenta3')
Insert into     @tables (name) values ('tbl_lenta4')

declare @table_name varchar(100)
declare @sql nvarchar(4192) -- tiksliai nepamenu koks max dydis - jei duomenys bus unicode geriau nvarchar

DECLARE C CURSOR FOR 
 SELECT name FROM @tables

-- atidarome kursoriu
OPEN C
    FETCH NEXT FROM C
    INTO @table_name

-- vykdome cikla tol kol yra rezultatu
WHILE @@FETCH_STATUS = 0 BEGIN

    -- Tikrijame ar table name ne nullas
    IF @table_name Is Not Null BEGIN

        -- craftinam selecta is atitinkamos lentos
        SET @sql = "SELECT * FROM '+@table_name -- can be SET @sql = 'DELETE FROM ' + @table_name (juokauju :)

        -- ivykdom selecta
        EXEC sp_executesql (@sql) -- cia aisku rasai ka tau reik nebutinai select...

    END

    -- imame sekanti irasa
    FETCH NEXT FROM C
    INTO @table_name

END
-- graziai uzdarome ir dealokuojame c kursoriu
CLOSE C;
DEALLOCATE C;


P.S.  Gal cia su Navision netycia ? ;)