115 votes

Comment récupérer plusieurs colonnes pour les utiliser dans une boucle de curseur ?

Lorsque j'essaie d'exécuter le snippet SQL suivant à l'intérieur d'une boucle de curseur,

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

Je reçois le message suivant,

Msg 15248, Niveau 11, État 1, Procédure sp_rename, Ligne 213
Soit le paramètre @objname est ambiguë ou que la demande @objtype (COLONNE) est erronée.

Quel est le problème et comment le résoudre ? J'ai essayé de mettre le nom de la colonne entre parenthèses. [] et les guillemets "" comme le suggèrent certains résultats de recherche.

Edit 1 -

Voici l'intégralité du script. Comment puis-je passer le nom de la table au sp rename ? Je ne suis pas sûr de savoir comment faire puisque les noms des colonnes sont dans une des nombreuses tables.

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

Edition 2 - Le script est conçu pour renommer les colonnes dont les noms correspondent à un modèle, dans ce cas avec un préfixe "pct". Les colonnes se trouvent dans une variété de tables dans la base de données. Tous les noms de tables sont préfixés par "TestData".

199voto

Nikola Markovinović Points 12039

Voici une version légèrement modifiée. Les changements sont notés comme des commentaires de code.

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

0voto

Damien_The_Unbeliever Points 102139

Vous lui demandez de renommer une colonne, mais il n'a aucune idée du nom de la colonne. tableau cette colonne est dans.

sp_rename :

[ @objname = ] 'object_name'

Est le nom actuel qualifié ou non qualifié de l'objet utilisateur ou du type de données. Si l'objet à renommer est une colonne dans une table, object_name doit être sous la forme table.column o schema.table.column .

(C'est nous qui soulignons)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X