Lorsque j'essaie d'exécuter l'extrait de code SQL suivant dans 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 le réclamé@objtype
(COLONNE) est faux.
Qu'est-ce qui ne va pas et comment puis-je le réparer? J'ai essayé de mettre le nom de la colonne entre crochets []
, et les guillemets doubles ""
comme certains des résultats de recherche suggérés.
Modifier 1 -
Voici le script entier. Comment est-ce que je passe le nom de la table au rename sp? Je ne suis pas sûr de savoir comment faire cela car les noms des colonnes sont dans l'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
Edit 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 apparaissent dans diverses tables de la base de données. Tous les noms de table ont le préfixe "TestData".
Voici une version légèrement modifiée. Les modifications sont notées comme commentaire 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