2012-06-14 10 views
56

Quando provo ad eseguire il seguente frammento di codice SQL all'interno di un ciclo del cursore,Come posso recuperare più colonne da utilizzare in un ciclo di cursore?

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

ricevo il seguente messaggio,

Msg 15248, livello 11, stato 1, procedura sp_rename, Linea 213
O il parametro @objname è ambiguo o il richiesto @objtype (COLONNA) è errato.

Cosa c'è che non va e come lo risolvo? Ho provato a racchiudere il nome della colonna tra parentesi [] e le virgolette doppie "" come alcuni dei risultati di ricerca suggeriti.

Modifica 1 -

Ecco l'intero script. Come faccio a passare il nome della tabella alla sp rename? Non sono sicuro di come farlo poiché i nomi delle colonne si trovano in una delle tante tabelle.

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 

Edit 2 - Lo script è stato progettato per rinominare le colonne i cui nomi corrispondono a un modello, in questo caso con un prefisso "PCT". Le colonne si trovano in una varietà di tabelle all'interno del database. Tutti i nomi delle tabelle sono preceduti da "TestData".

+1

questa riga concatena una stringa. perché non lo si stampa in modo da poter vedere quale sia il contenuto della stringa, –

+0

'@ test' ha il [form di' table.column' o 'schema.table.column'] (http://msdn.microsoft .com/it/us/library/ms188351.aspx), non è vero? – GSerg

+0

Se @test contiene il nome qualificato deve essere in apostrofi. Se vale la stessa ipotesi, right() rimuoverà i primi tre caratteri nel nome della tabella; se volevi sostituire gli ultimi caratteri del nome della colonna, questo sarebbe 'SINISTRA'. Potresti espandere un po 'lo script aggiungendo set @test = ...? –

risposta

96

Qui è un po 'versione modificata. Le modifiche sono indicate come commenti al codice.

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

Una delle mie risposte preferite in SO. –

+0

@RubensMariuzzo Grazie, sei troppo generoso :-) –

+32

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

-2

Stai dicendo che per rinominare una colonna, ma non ha idea di quale tavolo che colonna è in

sp_rename:.

[ @objname = ] 'object_name'

è la corrente qualificato o nome non qualificato dell'oggetto utente o tipo di dati. Se l'oggetto da rinominare è una colonna in una tabella, nome_oggetto deve essere nel formato table.column o schema.table.column.

(enfasi aggiunta)

Problemi correlati