2012-06-14 9 views
56

Kiedy próbuję uruchomić następujące SQL fragment wewnątrz pętli kursora,Jak pobrać wiele kolumn do użycia w pętli kursora?

set @cmd = N'exec sp_rename ' + @test + N',' + 
      RIGHT(@test,LEN(@test)-3) + '_Pct' + N',''COLUMN''' 

pojawia się następujący komunikat,

Msg 15248, poziom 11, State 1, procedury sp_rename procedurze Linia 213
Parametr @objname jest niejednoznaczny lub zgłoszona @objtype (KOLUMNA) jest niepoprawna.

Co jest nie tak i jak mogę to naprawić? Próbowałem owijać nazwę kolumny w nawiasach [], a podwójne cudzysłowy "", podobnie jak niektóre sugerowane wyniki wyszukiwania.

Edytuj 1 -

Oto cały skrypt. Jak przekazać nazwę tabeli do zmiany nazwy sp? Nie jestem pewien, jak to zrobić, ponieważ nazwy kolumn znajdują się w jednej z wielu tabel.

BEGIN TRANSACTION 

declare @cnt int 
declare @test nvarchar(128) 
declare @cmd nvarchar(500) 
declare Tests cursor for 
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE 'pct%' AND TABLE_NAME LIKE 'TestData%' 

open Tests 
fetch next from Tests into @test 
while @@fetch_status = 0 
BEGIN 
    set @cmd = N'exec sp_rename ' + @test + N',' + RIGHT(@test,LEN(@test)-3) + '_Pct' + N', column' 

    print @cmd 

    EXEC sp_executeSQL @cmd 

    fetch next from Tests into @test 
END 

close Tests 
deallocate Tests 


ROLLBACK TRANSACTION 
--COMMIT TRANSACTION 

Edycja 2 - Skrypt przeznaczony jest do zmiany nazwy kolumn, których nazwy pasują do wzorca, w tym przypadku z „proc” prefiksem. Kolumny występują w różnych tabelach w bazie danych. Wszystkie nazwy tabel są poprzedzone prefiksem "TestData".

+1

linia ta łączy łańcuch. dlaczego go nie wydrukujesz, żebyś mógł zobaczyć, co zawiera napis, –

+0

'@ test' ma [postać' table.column' lub 'schema.table.column'] (http://msdn.microsoft .com/en-us/library/ms188351.aspx), nieprawdaż? – GSerg

+0

Jeśli @test zawiera kwalifikowaną nazwę, musi znajdować się w apostrofach. Jeśli zachowuje się to samo założenie, right() usunie pierwsze trzy znaki z nazwy tabeli; w Tobie chciałbyś zamienić ostatnie znaki nazwy kolumny, to byłby "LEWO". Czy mógłbyś nieco rozszerzyć skrypt, dodając set @test = ...? –

Odpowiedz

96

tutaj jest nieznacznie zmodyfikowane wersje. Zmiany są odnotowywane jako komentarz do kodu.

BEGIN TRANSACTION 

declare @cnt int 
declare @test nvarchar(128) 
-- variable to hold table name 
declare @tableName nvarchar(255) 
declare @cmd nvarchar(500) 
-- local means the cursor name is private to this code 
-- fast_forward enables some speed optimizations 
declare Tests cursor local fast_forward for 
SELECT COLUMN_NAME, TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME LIKE 'pct%' 
    AND TABLE_NAME LIKE 'TestData%' 

open Tests 
-- Instead of fetching twice, I rather set up no-exit loop 
while 1 = 1 
BEGIN 
    -- And then fetch 
    fetch next from Tests into @test, @tableName 
    -- And then, if no row is fetched, exit the loop 
    if @@fetch_status <> 0 
    begin 
    break 
    end 
    -- Quotename is needed if you ever use special characters 
    -- in table/column names. Spaces, reserved words etc. 
    -- Other changes add apostrophes at right places. 
    set @cmd = N'exec sp_rename ''' 
      + quotename(@tableName) 
      + '.' 
      + quotename(@test) 
      + N''',''' 
      + RIGHT(@test,LEN(@test)-3) 
      + '_Pct''' 
      + N', ''column''' 

    print @cmd 

    EXEC sp_executeSQL @cmd 
END 

close Tests 
deallocate Tests 

ROLLBACK TRANSACTION 
--COMMIT TRANSACTION 
+0

Jedna z moich ulubionych odpowiedzi w SO. –

+0

@RubensMariuzzo Dzięki, jesteś zbyt hojny :-) –

+32

TLDR; FETCH NEXT OD db_cursor INTO '@ var1,' @ var2 –

-2

Mówisz to, aby zmienić nazwę kolumny, ale nie ma pojęcia, które stół że kolumna jest w

sp_rename.

[ @objname = ] 'object_name'

Czy obecny wykwalifikowany lub niekwalifikowana nazwa obiektu użytkownika lub typu danych. Jeśli obiekt, którego nazwa ma zostać zmieniona, jest kolumną w tabeli, nazwa_obiektu musi mieć postać table.column lub schema.table.column.

(Podkreślenie)