2012-01-20 14 views
6

Tengo varias tablas que ya existen en mi base de datos. Algunos de ellos tienen bastantes columnas.Genere automáticamente un tipo de tabla definido por el usuario que coincida con una tabla existente

Quiero hacer algunos procedimientos almacenados para hacer una declaración de combinación con estas tablas. Para hacer eso, me gustaría que el parámetro del procedimiento almacenado sea un tipo de tabla definida por el usuario.

Puedo ir a la secuencia de comandos de cada tabla y modificarla a una declaración de creación de tipo de tabla definida por el usuario.

Pero lo que realmente me gustaría es una forma de generar un tipo de tabla definido por el usuario de una tabla existente en mi base de datos. Podría agregar esa secuencia de comandos a la compilación de mi base de datos (y luego agregar nuevas columnas a una tabla no necesita más de una edición).

¿Hay alguna manera de hacerlo? ¿O debería estar ocupado scripting mis tablas?

+0

Existen procedimientos almacenados en el sistema, p. 'sp_columns', que le permitirá sacar todos los metadatos. Puede darle masajes y usar SQL dinámico para crear sus tablas clonadas. Supongo que ha pensado en usar 'SELECT * INTO NewTable FROM OldTable WHERE 42 = 13' para crear una nueva tabla vacía con la misma estructura que una tabla existente, pero sin filas. – HABO

+1

@ user92546 - Una 'tabla' y un' tipo de tabla definido por el usuario' no son lo mismo. – MatBailie

Respuesta

3

En SQL Server Management Studio, puede hacer clic con el botón derecho en una base de datos y, en TAREAS, seleccionar la secuencia de comandos de la base de datos. Elija solo Tablas y luego las tablas que le interesan.

No le ofrece una ventanilla única de lo que desea, pero puede crear guiones de muchas tablas de manera rápida y sencilla. Y luego, permítale hacer un poco de buscar y reemplazar para obtener lo que necesita.

1

que no te has intentado esto, pero sé que funciona en tablas temporales:

SELECT * 
INTO NewTable 
FROM OldTable 
WHERE FALSE 

Sin embargo tenga cuidado de que copia todo lo que necesita, no traerá a través de cualquier llaves, índices o permisos.

Editado: Gracias por la punta user92546

+1

No es necesario 'TRUNCATE' si no mueve ninguna fila. Solo agregue una cláusula 'WHERE' que nunca arroje la verdad, p. 'DONDE 'Congreso' = 'Progreso'. – HABO

+1

Lea la pregunta detenidamente. El OP es después de una definición de tabla * script *, no después de una tabla. Más específicamente, se supone que el script termina siendo un * script de definición de * UDT type, pero en cualquier caso, debe ser un * script *. –

+0

@Andriy - usted es exactamente correcto. La mayoría de las respuestas muestran cómo guiar una tabla ... – Vaccano

1

No sabía que era un asistente para generar scripts de base como la que está hablando de demócratas en su respuesta. Y parece un método más universal que el que he estado usando, porque el asistente te permite generar scripts para diferentes tipos de objetos de una vez.

Aún así, creo que voy a compartir el mío, ya que me parece un poco más simple y resulta bastante útil cuando solo necesitas escribir objetos del mismo tipo, como solo tablas.

Por lo tanto, aquí va (específicamente para las tablas):

  1. Abrir el Explorador de objetos (F8) y conectarlo a la instancia de servidor de destino.

  2. Expande el artículo Bases de datos.

  3. Expanda el elemento con el nombre de su base de datos.

  4. Haga clic en Tablas.

  5. Detalles del Explorador de Objetos Abierto (F7). Ahora debería mostrar la lista de tablas de usuarios.

  6. Utilizando los métodos estándar de Windows para seleccionar varios objetos (como Ctrl + clic), seleccione las tablas que desea secuenciar.

  7. Haga clic derecho en cualquiera de los elementos seleccionados y elija Script Table como ▸, luego elija el tipo de script y dónde guardarlo.

cuando se necesita para la escritura de diferentes tipos de objetos, proceder a un objeto diferente ‘carpeta’ Explorer en lugar de las Tablas , por ejemplo, para procedimientos almacenados sería Programación \ Procedimientos almacenados.

1

Necesito lo mismo de vez en cuando. Aquí hay un pequeño guión que armé. Es un poco difícil y no confiaría en mi vida, pero funciona bastante bien en mi caso. No escribe claves, pero para mi caso no es necesario. Sin embargo, estoy en SQL 2012, así que no estoy completamente seguro de que esto funcione como en SQL 2008. No lo probé para algunos de los tipos más 'exóticos' como geometry, geography y amigos, ya que nunca necesité usalos, usalos a ellos.

declare 
    @tablename nvarchar(50)='Users', 
    @schemaname nvarchar(50)='dbo', 
    @sql nvarchar(max)=N''; 

select @sql += N',' + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'[' + c.COLUMN_NAME + N'] [' + DATA_TYPE + N']' 
    + case when c.CHARACTER_MAXIMUM_LENGTH is not null then N'(' + case c.CHARACTER_MAXIMUM_LENGTH when -1 then 'max' else cast(c.CHARACTER_MAXIMUM_LENGTH as nvarchar(10)) end + N')' else N'' end 
    + case when c.DATA_TYPE = N'numeric' then N'('+CAST(NUMERIC_PRECISION as nvarchar(10))+N', '+CAST(NUMERIC_SCALE as nvarchar(10))+N')' else N'' end 
    + case when c.is_nullable <> N'NO' then N' NULL' else N' NOT NULL'end 
from INFORMATION_SCHEMA.COLUMNS c 
where TABLE_NAME = @tablename AND TABLE_SCHEMA = @schemaname 
order by ORDINAL_POSITION; 

set @sql = stuff(@sql, 1, 1, N'CREATE TYPE [' + @schemaname + N'].[tab_' + @tablename + N'] AS TABLE(') 
    + nchar(13) + nchar(10) + ')' + nchar(13) + nchar(10) + 'GO'; 
set @sql += nchar(13) + nchar(10) + '--GRANT EXEC ON TYPE::[' + @schemaname + N'].[tab_' + @tablename + N'] TO [User];' 
    + nchar(13) + nchar(10) + '--GO'; 

print @sql 
-- If you're happy with the sql, you can pass it to sp_executesql to create your type 
-- exec sp_executesql @sql; 
Cuestiones relacionadas