una tipos tabla sirve recorrer que procedimientos para example estructura cursores crea como columnas almacenados tsql sql-server-2005

tsql - tipos - ¿Cómo busco varias columnas para usar en un bucle de cursor?



recorrer cursor sql server (2)

Cuando intento ejecutar el siguiente fragmento de SQL dentro de un bucle de cursor,

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

Recibo el siguiente mensaje,

Msg 15248, nivel 11, estado 1, procedimiento nombre_re, línea 213
O el parámetro @objname es ambiguo o el @objtype reclamado (COLUMN) es incorrecto.

¿Qué está mal y cómo lo soluciono? Intenté ajustar el nombre de la columna entre corchetes [] y comillas dobles "" como algunos de los resultados de búsqueda sugeridos.

Editar 1 -

Aquí está todo el guión. ¿Cómo paso el nombre de la tabla al cambio de nombre de sp? No estoy seguro de cómo hacerlo ya que los nombres de columna están en una de muchas tablas.

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

Editar 2: el script está diseñado para cambiar el nombre de las columnas cuyos nombres coinciden con un patrón, en este caso con un prefijo "pct". Las columnas se producen en una variedad de tablas dentro de la base de datos. Todos los nombres de tabla tienen el prefijo "TestData".


Aquí hay una versión ligeramente modificada. Los cambios se anotan como comentarios del código.

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


Le está diciendo que cambie el nombre de una columna, pero no tiene idea en qué tabla está esa columna.

sp_rename :

[ @objname = ] ''object_name''

Es el nombre actual calificado o no calificado del objeto de usuario o tipo de datos. Si el objeto que se va a renombrar es una columna en una tabla, object_name debe estar en la forma table.column o schema.table.column .

(Énfasis añadido)