¿Cómo se toma una tabla y autogenerar los procesos almacenados CRUD en SSMS?¿Cómo puedo generar procedimientos almacenados CRUD desde una tabla en SQL Server Management Studio
¿Cómo puedo generar procedimientos almacenados CRUD desde una tabla en SQL Server Management Studio
Respuesta
SSMS no tiene la capacidad de generar procedimientos CRUD. Puede generar instrucciones INSERT, UPDATE, etc. haciendo clic con el botón derecho, Script Table As> pero creo que tendrá mejor suerte con Mladen Prajdic's SSMS Tools Pack.
Este es un dios envía –
@DavidJohnson me alegro de que ayudó. Y si cree que CRUD es útil, espere hasta que SSMS falle y no recupere sus archivos. Mladen te tiene cubierto con opciones de guardado automático muy flexibles y potentes. –
Sí, eso me hace querer llorar. No hay panacea –
Si está utilizando Visual Studio puede hacerlo: http://weblogs.asp.net/stevewellens/archive/2009/12/11/automatically-generate-stored-procedures-with-visual-studio.aspx
Esto se ve muy útil también. El pájaro temprano obtiene el gusano aunque –
Sí, pero es el segundo ratón que obtiene el queso. –
Ah, dang que tienes razón. –
que tienen una secuencia de comandos TSQL sencilla que utilizo para hacer el mío. Es básico pero se puede modificar fácilmente para satisfacer tus necesidades. Genera TSQL para un Procedimiento de Recuperación, Selección y Supresión utilizando la tabla & vista que especifique.
/*
This is a simple, single-table CRUD Generator. It does not have a bunch of
bells and whistles, and is easy to follow and modify. I wrote this to make
my job easier, and I am sharing it with you to do with it as you wish.
The Basics:
The TSQL below will create 3 procedures:
1. An Upsert Procedure: Suffix _ups
2. A Select Procedure: Suffix _sel
3. A Delete Procedure: Suffix _del
A Little More Detail:
Things you should know:
All 3 procedures have a parameter called @MyID which is used to set
the Context, so that my audit procedures get the validated user. If you
Have no use for it, you'll need to remove the piece of generator code
that adds it as a parameter to each of the 3 procedures. You will also
need to remove the PRINT statement for each procedure that looks like:
PRINT N' SET CONTEXT_INFO @MyID;' + CHAR(13) + CHAR(10)
This generator expects to perform inserts, updates, and deletes on a
table, and selects from a view. If you want to perform selects directly
from the table, simply use the table name in both @TableName and
@ViewName.
The Upsert Procedure:
If ID (Primary Key) is supplied it will perform an Update. Otherwise it
will perform an Insert. This generator is hard-coded to avoid inserting
or updating these particular fields:
Created
CreatedBy
Modified
ModifiedBy
RowVersion
<The Primary Key Field>
That's because in my databases I use those field names for audit, and they
are never modified except internally within the database. You can modify
the part of this procedure that performs this function to suit your needs.
This generator always uses the Parameter name @ID to represent the Primary
key defined for the table. This is my preference but you can modify to suit.
The Select Procedure:
If ID (Primary Key) is supplied it will select a single row from the View
(Table) whose name you provide. Otherwise it will select all rows. If the
@ISACTIVE_SEL variable is set to 1 (True), then the Select Procedure expects
your View (Table) to have a bit-type field named 'IsActive'. My tables are
standardized to this. If @ISACTIVE_SEL = 1 the Select Procedure will have an
additional parameter called @IsActive (bit). When @ID is not supplied, and
@IsActive is not supplied, the procedure selects all rows. When @ID is not
supplied, and @IsActive is supplied, the procedure selects all rows where
the field IsActive matches the parameter @IsActive
The Delete Procedure:
The Delete Pocedure requires that the Key value and the RowVersion value
be supplied. I use an Int type RowVersion, so if you use TimeStamp (varbinary(128))
then you will need to tweak the generator.
--Casey W Little
--Kaciree Software Solutions, LLC
Version 1.00
*/
--Type Your Database Name in this Use statement:
USE [<Your Database>]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*MODIFY THE VALUES BELOW TO SUIT YOUR NEEDS*/
DECLARE @DBName nvarchar(100)=N'<Your Database>';
DECLARE @ProcName nvarchar(100)=N'<Your Proc Name>';
DECLARE @DBRoleName nvarchar(100)=N'<Role that should have exec Rights>';
DECLARE @TableName nvarchar(100)=N'<Your Table Name>';
DECLARE @ViewName nvarchar(100)=N'<Your View Name>';
DECLARE @OrderBy nvarchar(100)=N'<Your Field Name>';
DECLARE @OrderByDir nvarchar(4)=N'ASC';
DECLARE @AUTHOR nvarchar(50) ='<Your Name & Company>';
DECLARE @DESC nvarchar(100) ='<Proc Information>'; -- Ex. 'User Data' will return 'Description : Upsert User Data'
DECLARE @ISACTIVE_SEL bit =0; --Set to 1 if your table has a Bit field named IsActive
/*DO NOT MODIFY BELOW THIS LINE!!!*/
DECLARE @NNND char(23) ='NOT_NULLABLE_NO_DEFAULT';
DECLARE @NNWD char(22) ='NOT_NULLABLE_W_DEFAULT';
DECLARE @NBLE char(8) ='NULLABLE';
DECLARE @LEGEND nvarchar(max);
DECLARE @PRIMARY_KEY nvarchar(100);
--Set up Legend
SET @LEGEND = N'USE [' + @DBName + N'];' + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + N'GO' + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + N'SET ANSI_NULLS ON' + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + N'GO' + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + N'SET QUOTED_IDENTIFIER ON' + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + N'GO' + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + N'-- ===================================================================' + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + N'-- Author : ' + @AUTHOR + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + N'-- Create date : ' + CONVERT(nvarchar(30),GETDATE(),101) + CHAR(13) + CHAR(10)
SET @LEGEND = @LEGEND + N'-- Revised date: ' + CHAR(13) + CHAR(10)
--Get Primary Key Field
SELECT TOP 1 @PRIMARY_KEY = COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE OBJECTPROPERTY(OBJECT_ID(constraint_name), 'IsPrimaryKey') = 1 AND TABLE_NAME = @TableName AND TABLE_CATALOG = @DBName;
DECLARE TableCol Cursor FOR
SELECT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE, c.CHARACTER_MAXIMUM_LENGTH
, IIF(c.COLUMN_NAME='RowVersion',@NBLE,IIF([email protected]_KEY,@NBLE,IIF(c.IS_NULLABLE = 'NO' AND c.COLUMN_DEFAULT IS NULL,@NNND,IIF(c.IS_NULLABLE = 'NO' AND c.COLUMN_DEFAULT IS NOT NULL,@NNWD,@NBLE)))) AS [NULLABLE_TYPE]
FROM INFORMATION_SCHEMA.Columns c INNER JOIN
INFORMATION_SCHEMA.Tables t ON c.TABLE_NAME = t.TABLE_NAME
WHERE t.Table_Catalog = @DBName
AND t.TABLE_TYPE = 'BASE TABLE'
AND t.TABLE_NAME = @TableName
ORDER BY [NULLABLE_TYPE], c.ORDINAL_POSITION;
DECLARE @TableSchema varchar(100), @cTableName varchar(100), @ColumnName varchar(100);
DECLARE @DataType varchar(30), @CharLength int, @NullableType varchar(30);
DECLARE @PARAMETERS nvarchar(max);
DECLARE @INSERT_FIELDS nvarchar(max),@INSERT_VALUES nvarchar(max);
DECLARE @UPDATE_VALUES nvarchar(max);
SET @PARAMETERS ='@MyID int,';
SET @INSERT_FIELDS ='';
SET @INSERT_VALUES ='';
SET @UPDATE_VALUES ='';
-- open the cursor
OPEN TableCol
-- get the first row of cursor into variables
FETCH NEXT FROM TableCol INTO @TableSchema, @cTableName, @ColumnName, @DataType, @CharLength, @NullableType
WHILE @@FETCH_STATUS = 0
BEGIN
IF @ColumnName NOT IN('Created','CreatedBy','Modified','ModifiedBy')
BEGIN
SET @[email protected] + '@' + IIF(@[email protected]_KEY,'ID',@ColumnName) + ' ' + iif(@CharLength IS NULL,@DataType,@DataType + '(' +
CAST(@CharLength AS nvarchar(10)) + ')') + IIF(@[email protected] OR @[email protected],',','=NULL,');
IF @ColumnName <> @PRIMARY_KEY AND @ColumnName <> N'RowVersion'
BEGIN
SET @[email protected]_FIELDS + '[' + @ColumnName + '],';
SET @[email protected]_VALUES + '@' + IIF(@[email protected]_KEY,'ID',@ColumnName) + ',';
SET @[email protected]_VALUES + '[' + @ColumnName + '][email protected]' + IIF(@[email protected]_KEY,'ID',@ColumnName) + ',';
END
END
FETCH NEXT FROM TableCol INTO @TableSchema, @cTableName, @ColumnName, @DataType, @CharLength, @NullableType
END;
SET @PARAMETERS=LEFT(@PARAMETERS,LEN(@PARAMETERS)-1)
SET @INSERT_FIELDS=LEFT(@INSERT_FIELDS,LEN(@INSERT_FIELDS)-1)
SET @INSERT_VALUES=LEFT(@INSERT_VALUES,LEN(@INSERT_VALUES)-1)
SET @UPDATE_VALUES=LEFT(@UPDATE_VALUES,LEN(@UPDATE_VALUES)-1)
-- ----------------
-- clean up cursor
-- ----------------
CLOSE TableCol;
DEALLOCATE TableCol;
--Print Upsert Statement
PRINT N'/****** Object: StoredProcedure [dbo].[' + @ProcName + '_ups] Script Date: ' + CAST(GETDATE() AS nvarchar(30)) + ' ******/' + CHAR(13) + CHAR(10)
PRINT @LEGEND;
PRINT N'-- Description : Upsert ' + @DESC + CHAR(13) + CHAR(10)
PRINT N'-- ===================================================================' + CHAR(13) + CHAR(10)
PRINT CHAR(13) + CHAR(10)
PRINT N'CREATE PROCEDURE [dbo].[' + @ProcName + '_ups]' + CHAR(13) + CHAR(10);
PRINT N' (' + @PARAMETERS + N')' + CHAR(13) + CHAR(10);
PRINT N'AS' + CHAR(13) + CHAR(10)
PRINT N'BEGIN' + CHAR(13) + CHAR(10)
PRINT N' SET CONTEXT_INFO @MyID;' + CHAR(13) + CHAR(10)
PRINT N' IF @ID IS NULL OR @ID = 0' + CHAR(13) + CHAR(10)
PRINT N' BEGIN' + CHAR(13) + CHAR(10)
PRINT N' INSERT INTO [dbo].[' + @TableName + ']' + CHAR(13) + CHAR(10)
PRINT N' (' + @INSERT_FIELDS + N')' + CHAR(13) + CHAR(10)
PRINT N' VALUES' + CHAR(13) + CHAR(10)
PRINT N' (' + @INSERT_VALUES + N');' + CHAR(13) + CHAR(10)
PRINT N' SELECT * FROM [dbo].[' + @ViewName + '] WHERE [ID] = SCOPE_IDENTITY();' + CHAR(13) + CHAR(10)
PRINT N' END' + CHAR(13) + CHAR(10)
PRINT N' ELSE' + CHAR(13) + CHAR(10)
PRINT N' BEGIN' + CHAR(13) + CHAR(10)
PRINT N' UPDATE [dbo].[' + @TableName + ']' + CHAR(13) + CHAR(10)
PRINT N' SET ' + @UPDATE_VALUES + CHAR(13) + CHAR(10)
PRINT N' WHERE ([' + @PRIMARY_KEY + '] = @ID) AND ([RowVersion] = @RowVersion);' + CHAR(13) + CHAR(10)
PRINT N' SELECT * FROM [dbo].[' + @ViewName + '] WHERE [ID] = @ID;' + CHAR(13) + CHAR(10)
PRINT N' END' + CHAR(13) + CHAR(10)
PRINT N'END' + CHAR(13) + CHAR(10)
PRINT N'GO' + CHAR(13) + CHAR(10)
PRINT CHAR(13) + CHAR(10)
----Now add GRANT and DENY permissions to the Role
PRINT N'GRANT EXECUTE ON [dbo].[' + @ProcName + '_ups] TO [' + @DBRoleName + ']' + CHAR(13) + CHAR(10)
PRINT N'GO' + CHAR(13) + CHAR(10)
PRINT N'DENY VIEW DEFINITION ON [dbo].[' + @ProcName + '_ups] TO [' + @DBRoleName + ']' + CHAR(13) + CHAR(10)
PRINT N'GO' + CHAR(13) + CHAR(10)
PRINT CHAR(13) + CHAR(10)
PRINT CHAR(13) + CHAR(10)
--Print Select Statement
PRINT N'/****** Object: StoredProcedure [dbo].[' + @ProcName + '_sel] Script Date: ' + CAST(GETDATE() AS nvarchar(30)) + ' ******/' + CHAR(13) + CHAR(10)
PRINT @LEGEND;
PRINT N'-- Description : Select ' + @DESC + CHAR(13) + CHAR(10)
PRINT N'-- ===================================================================' + CHAR(13) + CHAR(10)
PRINT CHAR(13) + CHAR(10)
PRINT N'CREATE PROCEDURE [dbo].[' + @ProcName + '_sel]' + CHAR(13) + CHAR(10);
PRINT N' (@MyID int, @ID int=NULL' + IIF(@ISACTIVE_SEL = 1,', @IsActive bit=NULL','') + ')' + CHAR(13) + CHAR(10);
PRINT N'AS' + CHAR(13) + CHAR(10)
PRINT N'BEGIN' + CHAR(13) + CHAR(10)
PRINT N' SET CONTEXT_INFO @MyID;' + CHAR(13) + CHAR(10)
PRINT N' IF @ID IS NULL OR @ID = 0' + CHAR(13) + CHAR(10)
IF @ISACTIVE_SEL = 1
BEGIN
PRINT N' BEGIN' + CHAR(13) + CHAR(10)
PRINT N' IF @IsActive IS NULL' + CHAR(13) + CHAR(10)
PRINT N' SELECT * FROM [dbo].[' + @ViewName + '] ORDER BY [' + @OrderBy + '] ' + @OrderByDir + ';' + CHAR(13) + CHAR(10)
PRINT N' ELSE' + CHAR(13) + CHAR(10)
PRINT N' SELECT * FROM [dbo].[' + @ViewName + '] WHERE [isActive] = @IsActive ORDER BY [' + @OrderBy + '] ' + @OrderByDir + ';' + CHAR(13) + CHAR(10)
PRINT N' END' + CHAR(13) + CHAR(10)
END
ELSE
PRINT N' SELECT * FROM [dbo].[' + @ViewName + '] ORDER BY [' + @OrderBy + '] ' + @OrderByDir + ';' + CHAR(13) + CHAR(10)
PRINT N' ELSE' + CHAR(13) + CHAR(10)
PRINT N' SELECT * FROM [dbo].[' + @ViewName + '] WHERE [ID] = @ID;' + CHAR(13) + CHAR(10)
PRINT N'END' + CHAR(13) + CHAR(10)
PRINT N'GO' + CHAR(13) + CHAR(10)
PRINT CHAR(13) + CHAR(10)
----Now add GRANT and DENY permissions to the Role
PRINT N'GRANT EXECUTE ON [dbo].[' + @ProcName + '_sel] TO [' + @DBRoleName + ']' + CHAR(13) + CHAR(10)
PRINT N'GO' + CHAR(13) + CHAR(10)
PRINT N'DENY VIEW DEFINITION ON [dbo].[' + @ProcName +'_sel] TO [' + @DBRoleName + ']' + CHAR(13) + CHAR(10)
PRINT N'GO' + CHAR(13) + CHAR(10)
PRINT CHAR(13) + CHAR(10)
PRINT CHAR(13) + CHAR(10)
--Print Delete Statement
PRINT N'/****** Object: StoredProcedure [dbo].[' + @ProcName + '_del] Script Date: ' + CAST(GETDATE() AS nvarchar(30)) + ' ******/' + CHAR(13) + CHAR(10)
PRINT @LEGEND;
PRINT N'-- Description : Delete ' + @DESC + CHAR(13) + CHAR(10)
PRINT N'-- ===================================================================' + CHAR(13) + CHAR(10)
PRINT CHAR(13) + CHAR(10)
PRINT N'CREATE PROCEDURE [dbo].[' + @ProcName + '_del]' + CHAR(13) + CHAR(10);
PRINT N' (@MyID int, @ID int, @RowVersion int)' + CHAR(13) + CHAR(10);
PRINT N'AS' + CHAR(13) + CHAR(10)
PRINT N'BEGIN' + CHAR(13) + CHAR(10)
PRINT N' SET CONTEXT_INFO @MyID;' + CHAR(13) + CHAR(10)
PRINT N' SET NOCOUNT ON;' + CHAR(13) + CHAR(10)
PRINT N' DELETE FROM [dbo].[' + @TableName + '] WHERE [' + @PRIMARY_KEY + '][email protected] AND [RowVersion][email protected];' + CHAR(13) + CHAR(10)
PRINT N' SELECT @@ROWCOUNT as [Rows Affected];' + CHAR(13) + CHAR(10)
PRINT N'END' + CHAR(13) + CHAR(10)
PRINT N'GO' + CHAR(13) + CHAR(10)
PRINT CHAR(13) + CHAR(10)
----Now add GRANT and DENY permissions to the Role
PRINT N'GRANT EXECUTE ON [dbo].[' + @ProcName + '_del] TO [' + @DBRoleName + ']' + CHAR(13) + CHAR(10)
PRINT N'GO' + CHAR(13) + CHAR(10)
PRINT N'DENY VIEW DEFINITION ON [dbo].[' + @ProcName +'_del] TO [' + @DBRoleName + ']' + CHAR(13) + CHAR(10)
PRINT N'GO' + CHAR(13) + CHAR(10)
Esto es oro. muchas gracias, tal wow ... – Luiscencio
Esto es genial. Gracias. Para cualquiera que use esto para tablas de esquemas que no sean DBO, además de usar una variable de esquema, también necesita modificar el código Obtener PK para dar cuenta del esquema. OBJECTPROPERTY (OBJECT_ID (CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME) – jbd
este debería ir a la nueva documentación bajo algo como "cómo generar CRUD para mssql" –
Además de las herramientas mencionadas anteriormente, hay otra herramienta gratuita que puede usar para realizar el trabajo con unos pocos clics.
Para hacerlo, debe ingresar el prefijo y el sufijo en la ventana de opciones ApexSQL Complete, donde puede elegir una de las pestañas secundarias para cada plantilla de procedimiento CRUD (Seleccionar, Insertar, Actualizar, Eliminar). Una vez hecho esto, la función de procedimientos de CRUD estará disponible haciendo clic con el botón derecho en la ventana del Explorador de objetos, en la base de datos o en la tabla del menú desplegable.
Aquí es un article con más detalles sobre esta funcionalidad (artículo es un poco viejo, aunque, como se añade en función de la versión actual)
- 1. Depuración de procedimientos almacenados en Management studio
- 2. ¿Cómo se crean las plantillas de procedimientos almacenados de SQL Server 2005 en SQL Server 2005 Management Studio?
- 3. Procedimientos almacenados del sistema útil en SQL Server
- 4. SQL Server Management Studio
- 5. Escritura de todos los procedimientos almacenados en Management Studio 2005
- 6. Drop table en Sql Server por Sql Server Management Studio
- 7. SQL Server Management Studio falta
- 8. Base de datos SQL Azure usando SQL Server Management Studio
- 9. ¿Encuentra fácilmente un procedimiento almacenado en SQL Server Management Studio desde 1000 en vista de árbol?
- 10. Cómo depurar procedimientos almacenados en SQL Server 2008 sin CLR?
- 11. Lista de procedimientos almacenados de la tabla
- 12. Visual Studio vs. SQL Server Management Studio: su elección
- 13. ¿Cómo puedo automatizar la tarea "generar scripts" en SQL Server Management Studio 2008?
- 14. Macros en SQL Server Management Studio
- 15. Pruebas unitarias en SQL Server Management Studio
- 16. ¿Cómo puedo encontrar llamadas a procedimientos almacenados?
- 17. Acceso a conjuntos de resultados desde Procedimientos almacenados Transact-SQL SQL Server
- 18. C#/SQL Obtenga todos los procedimientos almacenados y su código
- 19. ¿Cómo habilitar la depuración de procedimientos almacenados en Visual Studio?
- 20. Agregando una nueva fila ¿Usando SQL Server Management Studio?
- 21. ¿Cómo hacer que SQL Management Studio vea la nueva tabla?
- 22. Cómo editar rápidamente los valores en la tabla en SQL Server Management Studio?
- 23. Crear clave externa en SQL Server Management Studio
- 24. Cómo generar secuencias de comandos de instalación de procedimientos almacenados CLR SQL sin Visual Studio
- 25. SQL Server Management Studio: significado de icono
- 26. Problema con SQL Server Management Studio IntelliSense
- 27. SQL Server Management Studio Vista de esquema
- 28. ¿Puedo usar SQL Server Management Studio 2005 para 2008 DB?
- 29. SQL Server Management Studio Express y MySQL?
- 30. ¿Por qué SQL Server Management Studio genera código usando corchetes?
No creo que tiene esta funcionalidad. – Joe