如何在SSMS中爲其存儲表併爲其自動生成CRUD存儲過程?如何從SQL Server Management Studio中的表生成CRUD存儲過程
回答
SSMS不具備生成CRUD程序的能力。您可以通過右鍵單擊「腳本表格」來生成INSERT,UPDATE語句等,但我認爲Mladen Prajdic's SSMS Tools Pack會帶來更好的運氣。
這是上帝發送 – 2012-07-26 18:58:20
@DavidJohnson很高興幫助。如果您認爲CRUD很有用,請等到SSMS崩潰並且不能恢復您的文件。 Mladen爲你提供了非常靈活和強大的自動保存選項。 – 2012-07-26 19:05:57
是的,那種讓我想哭的樣子。沒有萬能藥。 – 2012-07-26 19:17:01
如果您正在使用Visual Studio,你可以做到這一點:http://weblogs.asp.net/stevewellens/archive/2009/12/11/automatically-generate-stored-procedures-with-visual-studio.aspx
這看起來也很有幫助。早起的鳥兒得到蠕蟲 – 2012-07-26 18:59:04
是的,但它是第二隻老鼠得到奶酪。 – 2012-07-27 00:48:18
阿當你說得對。 – 2012-07-27 02:32:04
我有我用來做我一個簡單的腳本TSQL。這是基本的,但很容易修改,以滿足您的需求。它使用您指定的表&視圖爲Upsert,Select和Delete Procedure生成TSQL。
/*
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)
這是黃金。非常感謝,哇...... – Luiscencio 2015-10-16 15:54:12
這太棒了。謝謝。對於任何人在非DBO模式表中使用它,除了使用模式變量之外,還需要修改Get PK代碼以說明模式。 OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA +'。'+ CONSTRAINT_NAME) – jbd 2016-02-06 00:14:01
這應該進入新的文檔,如「如何爲mssql生成CRUD」 – 2016-07-25 06:30:46
除了前面提到的工具之外,還有另外一個免費工具可以用來完成點擊幾下工作。
要做到這一點,你需要在ApexSQL Complete選項窗口,在這裏你可以選擇爲每個CRUD程序模板(選擇,插入,更新,刪除)子選項卡之一,進入前綴和後綴。完成此操作後,通過右鍵單擊對象瀏覽器窗口,數據庫或下拉菜單中的表格,可以使用CRUD過程功能。
這裏是一個article與有關該功能的更多詳細資料(文章是有點老了,雖然,作爲特徵被添加到當前版本)
- 1. 如何在SQL Server 2005 Management Studio中創建SQL Server 2005存儲過程模板?
- 2. 生成簡單的CRUD存儲過程
- 3. 作爲SQL Server Management Studio中的作業運行存儲過程
- 4. 未在Sql Server Management Studio中顯示存儲過程
- 5. 在SQL Server 2008 Management Studio中查找存儲過程
- 6. 重組存儲過程在SQL Server Management Studio中顯示
- 7. SQL Server Management Studio - 在系列中運行多個存儲過程
- 8. 如何在SQL Server Management Studio中測試存儲過程的性能
- 9. 爲SQL Server生成存儲過程
- 10. 控制SQL Server Management Studio腳本生成
- 11. SQL Server Management Studio - 瞭解存儲過程變量
- 12. 無法在SQL Server Management Studio中重置存儲過程緩存2008
- 13. SQL Server Management Studio
- 14. SQL Server Management Studio中的查詢成本
- 15. 如何從SQL Server存儲過程
- 16. SQL Server Management Studio集成到Sql Server 2005 Enterprise安裝程序中?
- 17. Azure表和SQL Server Management Studio
- 18. SQL在SQL Server Management Studio中
- 19. 通過SSMS使用Azure本地開發存儲(sql server management studio)
- 20. SQL Server存儲過程在SSRS報告生成器中計時
- 21. 如何從SQL Server中的存儲過程進行查詢?
- 22. SQL Server存儲過程,從多個表
- 23. 的SQL Server 2014 Management Studio中
- 24. 的SQL Server 2014 Management Studio中
- 25. sql server management studio中的連接列表
- 26. 如何SQL Server存儲在存儲過程中的SQL語句
- 27. 存儲過程返回int,而不是NVARCHAR在SQL Management Studio中
- 28. 來自SQL語句的SQL Server存儲過程生成器?
- 29. 2005 SQL Server Management Studio
- 30. SQL Server Management Studio ZEROFILL
我不相信它有這個功能。 – Joe 2012-07-26 16:15:10