SQL Server开发接口生成方法
為提高開發效率,生成固定格式的接口是必須的,以下以提供新增/修改/刪除/讀取接口為例:
以常見的表結構為例,特殊表結構可自己嘗試去調整方法
主要通過系視圖?sys.columns生成方法:為包含列的對象(如視圖或表)的每列返回一行。下面是包含列的對象類型的列表。
| 列名 | 數據類型 | 說明 |
| object_id | int | 此列所屬對象的 ID。 |
| name | sysname | 列名。在對象中是唯一的。 |
| column_id | int | 列的 ID。在對象中是唯一的。 列 ID 可以不按順序排列。 |
| system_type_id | tinyint | 列的系統類型的 ID。 |
| user_type_id | int | 用戶定義的列類型的 ID。 若要返回該類型的名稱,請在該列中聯接到 sys.types 目錄視圖。 |
| max_length | smallint | 列的最大長度(字節)。 -1 = 列數據類型為 varchar(max)、nvarchar(max)、varbinary(max) 或 xml。 對于 text 列,max_length 值將是 16,或者是 sp_tableoption 'text in row' 所設置的值。 |
| precision | tinyint | 如果列包含的是數值,則為該列的精度;否則為 0。 |
| scale | tinyint | 如果基于數值,則為列的小數位數;否則為 0。 |
| ? | ? | ? |
| ? | ? | ? |
| ? | ? | ? |
| is_rowguidcol | bit | 1 = 列為聲明的 ROWGUIDCOL。 |
| is_identity | bit | 1 = 列具有標識值 |
1、在Test數據庫生成方法
if OBJECT_ID('Curdsqlstring','P') is not nullDROP PROC Curdsqlstring go CREATE PROCEDURE Curdsqlstring(@TableName sysname) with encryption AS if OBJECT_ID(@TableName,'U') is nullreturn 0DECLARE @S NVARCHAR(MAX),@ColName NVARCHAR(MAX),@Identity sysname,@IdentityWHERE NVARCHAR(100),@Insert0 NVARCHAR(MAX),@Insert1 NVARCHAR(MAX),@Insert2 NVARCHAR(MAX),@Insert3 NVARCHAR(MAX) ,@UPDATE0 NVARCHAR(MAX) ,@UPDATE1 NVARCHAR(MAX),@UPDATE2 NVARCHAR(MAX),@UPDATE3 NVARCHAR(MAX),@SELECTWHERE0 NVARCHAR(MAX),@SELECTWHERE1 NVARCHAR(MAX),@SELECT0 NVARCHAR(MAX),@SELECT1 NVARCHAR(MAX),@DELETE NVARCHAR(MAX),@ColName2 NVARCHAR(MAX),@ObjectID INT,@UPDATECol1 NVARCHAR(MAX),@ColAll NVARCHAR(MAX),@InputCol sysname,@Write NVARCHAR(100),@OutputAll NVARCHAR(1000),@TableName2 sysname SELECT @Write='Roy'+char(32)+char(32)+char(32)+convert(varchar(10),getdate(),120),@Insert2='',@Insert3=''SELECT @S=CASE WHEN a.is_computed=1 THEN @S ELSE ISNULL(@s+',','')+'@'+Name+char(32)+ TYPE_NAME(user_type_id)+CASE when user_type_id in(34,35,36,48,52,56,58,59,60,61,62,98,99,104,122,127,189,241,256,241,40,41,129) then '' when user_type_id in(106,108) then '('+rtrim(Precision)+','+rtrim(Scale)+')'when user_type_id in (231,239) then CASE when max_length=-1 then '(max)' else '('+rtrim(max_length/2)+')' endwhen max_length=-1 then '(Max)'else '('+rtrim(max_length)+')' end+CASE when is_identity=1 then char(32)+'OUTPUT' else '' end END,@ColName=CASE when is_identity=1 OR a.is_computed=1 THEN @ColName else isnull(@ColName+',','')+quotename(Name) end,@ColName2=CASE when is_identity=1 OR a.is_computed=1 then @ColName2 else isnull(@ColName2+',','')+'@'+Name end,@UPDATECol1=CASE when Name!=N'ID' AND NOT EXISTS ( SELECT 1FROM sys.objects xJOIN sys.indexes y ON x.type = N'PK'AND x.name = y.nameJOIN sysindexkeys z ON z.id = x.object_idAND z.indid = y.index_idAND z.colid = a.Column_id AND x.object_id=a.object_id) AND a.is_computed=0 THEN ISNULL(@UPDATECol1+',','')+QUOTENAME(Name)+'='+'@'+Name ELSE @UPDATECol1 END,@IdentityWHERE=isnull(@IdentityWHERE,'')+CASE when COLUMNPROPERTY (OBJECT_ID, Name , 'IsIdentity' )=1 OR Name=N'ID' then quotename(Name)+'='+'@'+Name ELSE '' end,@ColAll=isnull(@ColAll+',','')+quotename(Name),@OutputAll=isnull(@OutputAll+',','')+'@'+Name from Sys.columns AS a WHERE a.OBJECT_ID=OBJECT_ID(@TableName) order by CASE when Name='ID' then 0 else 1 end,Column_idIF @IdentityWHERE = ''SELECT @IdentityWHERE = @IdentityWHERE+CASE WHEN @IdentityWHERE > '' AND EXISTS ( SELECT 1FROM sys.objects xJOIN sys.indexes y ON x.type = N'PK'AND x.name = y.nameJOIN sysindexkeys z ON z.id = a.object_idAND z.indid = y.index_idAND z.colid = a.Column_id ) THEN ' AND 'ELSE ''END+ CASE WHEN EXISTS ( SELECT 1FROM sys.objects xJOIN sys.indexes y ON x.type = N'PK'AND x.name = y.nameJOIN sysindexkeys z ON z.id = a.object_idAND z.indid = y.index_idAND z.colid = a.Column_id )THEN QUOTENAME(name) + '=' + '@' + nameELSE ''ENDFROM sys.columns AS aWHERE object_id = OBJECT_ID(@TableName)ORDER BY column_idIF @IdentityWHERE=''SELECT TOP 1 @IdentityWHERE=quotename(Name)+'='+'@'+Name FROM sys.columns WHERE OBJECT_ID=OBJECT_ID(@TableName) ORDER BY column_id --主鍵為第一列 SELECT @Identity=replace(left(@s,charindex(',',@s)-1),char(32)+'output',''),@ObjectID=OBJECT_ID(@TableName),@TableName=replace(replace(stuff(@TableName,1,charindex('.',@TableName),''),']',''),'[',''),@TableName2=CASE WHEN @TableName NOT LIKE '%.%' THEN ''+OBJECT_SCHEMA_NAME(@ObjectID)+'.'+@TableName ELSE @TableName ENDSELECT @Insert1='CREATE PROCEDURE c'+@TableName+char(10)+char(9)+char(9)+'('+@s+')'+char(10)+'AS',@Insert2='INSERT INTO '+@TableName2+char(10)+char(9)+'('+@ColName+')',@Insert3='VALUES'+char(10)+char(9)+'('+@ColName2+')'+CASE when exists(SELECT 1 from Sys.columns WHERE OBJECT_ID=@ObjectID and is_identity=1) then char(10)+char(10)+'SET '+left(@Identity,charindex(char(32),@Identity)-1)+'=SCOPE_IDENTITY()' else '' end,@UPDATE1='CREATE PROCEDURE u'+@TableName+char(10)+char(9)+char(9)+'('+replace(@s,char(32)+'output','')+')'+char(10)+'AS',@UPDATE2='UPDATE '+@TableName2+char(10)+'SET '+@UPDATECol1,@UPDATE3='WHERE '+@IdentityWHERE,@SELECTWHERE1='CREATE PROCEDURE r'+@TableName+'By'+stuff(left(@Identity,charindex(char(32),@Identity)-1),1,1,'')+char(10)+char(9)+char(9)+'('+@Identity+')'+char(10)+'AS'+char(10)+'SET NOCOUNT ON;'+char(10)+'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;'+char(10)+'SELECT '+char(10)+char(9)+@ColAll+char(10)+'From'+char(10)+char(9)+@TableName2+char(10)+'WHERE'+char(10)+char(9)+@IdentityWHERE,@SELECT1='CREATE PROCEDURE r'+@TableName+'ForAll'+char(10)+'AS'+char(10)+'SET NOCOUNT ON;'+char(10)+'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;'+char(10)+'SELECT '+char(10)+char(9)+@ColAll+char(10)+'From'+char(10)+char(9)+@TableName2,@DELETE='CREATE PROCEDURE d'+@TableName+char(10)+char(9)+'('+@Identity+')'+char(10)+'AS'+char(10)+'DELETE '+@TableName2+char(32)+'WHERE'+char(32)+@IdentityWHERE,@InputCol=CASE when exists(SELECT 1 from Sys.columns WHERE OBJECT_ID=@ObjectID and is_identity=1) then @Identity else '' end--Insert SELECT @Insert0= 'if OBJECT_ID('+quotename('c'+@TableName,'''')+',''P'') is not null'+char(13)+char(9)+'DROP PROC '+quotename('c'+@TableName) +char(10)+'Go'+char(13)+char(10)+'/'+replicate('*',160)+char(10)+ '%%存儲過程名:c'+@TableName+char(10)+char(10)+ '%%輸入參數:'+@ColName2+char(10)+char(10)+ '%%輸出參數:'+@InputCol+char(10)+char(10)+ '%%功能:新增記錄在表'+@TableName+char(10)+replicate('*',160)+char(10)+ '%%編寫:'+@Write+char(10)+char(10)+replicate('*',160)+'/' ,--UPDATE@UPDATE0= 'if OBJECT_ID('+quotename('u'+@TableName,'''')+',''P'') is not null'+char(13)+char(9)+'DROP PROC '+quotename('u'+@TableName) +char(10)+'Go'+char(13)+char(10)+'/'+replicate('*',160)+char(10)+ '%%存儲過程名:u'+@TableName+char(10)+char(10)+ '%%輸入參數:'+@OutputAll+char(10)+char(10)+ '%%輸出參數:'+char(10)+char(10)+ '%%功能:修改記錄在表'+@TableName+char(10)+replicate('*',160)+char(10)+ '%%編寫:'+@Write+char(10)+char(10)+replicate('*',160)+'/' , --SELECTWHERE @SELECTWHERE0= 'if OBJECT_ID('+quotename('r'+@TableName+'By'+stuff(left(@Identity,charindex(char(32),@Identity)-1),1,1,''),'''')+',''P'') is not null'+char(13)+char(9)+'DROP PROC '+quotename('r'+@TableName+'By'+stuff(left(@Identity,charindex(char(32),@Identity)-1),1,1,'')) +char(10)+'Go'+char(13)+char(10)+'/'+replicate('*',160)+char(10) +'%%存儲過程名:r'+@TableName+'By'+stuff(left(@Identity,charindex(char(32),@Identity)-1),1,1,'')+char(10)+char(10) +N'%%輸入參數:'+@Identity+char(10)+char(10) +N'%%輸出參數:'+char(10)+char(10) +N'%%功能:根據條件讀取記錄在表'+@TableName+char(10)+replicate('*',160)+char(10) +'%%編寫:'+@Write+char(10)+char(10)+replicate('*',160)+'/', --SELECT @SELECT0= 'if OBJECT_ID('+quotename('r'+@TableName+'ForAll','''')+',''P'') is not null'+char(13)+char(9)+'DROP PROC '+quotename('r'+@TableName+'ForAll') +char(10)+'Go'+char(13)+char(10)+'/'+replicate('*',160)+char(10) +'%%存儲過程名:r'+@TableName+'ForAll'+char(10)+char(10) +'%%輸入參數:'+char(10)+char(10) +'%%輸出參數:'+char(10)+char(10) +'%%功能:讀取記錄在表'+@TableName+char(10)+replicate('*',160)+char(10) +'%%編寫:'+@Write+char(10)+char(10)+replicate('*',160)+'/',@DELETE= 'if OBJECT_ID('+quotename('d'+@TableName,'''')+',''P'') is not null'+char(13)+char(9)+'DROP PROC '+quotename('d'+@TableName) +char(10)+'Go'+char(13)+char(10)+'/'+replicate('*',160)+char(10) +'%%存儲過程名:d'+@TableName+char(10)+char(10) +'%%輸入參數:'+char(10)+char(10) +'%%輸出參數:'+@Identity+char(10)+char(10) +'%%功能:刪除記錄在表'+@TableName+char(10)+replicate('*',160)+char(10) +'%%編寫:'+@Write+char(10)+char(10)+replicate('*',160)+'/'+char(10) +@DELETE+char(13)+char(10)+'Go'+char(13)+char(10)print 'USE '+db_name()+char(13)+char(10)+'Go'+char(13)+char(10) PRINT @Insert0 print @Insert1 print @Insert2 print @Insert3 PRINT 'Go'+char(13)+char(10) print @UPDATE0 print @UPDATE1 print @UPDATE2 print @UPDATE3 PRINT 'Go'+char(13)+char(10) print @SELECTWHERE0 print @SELECTWHERE1 PRINT 'Go'+char(13)+char(10) print @SELECT0 print @SELECT1 PRINT 'Go'+char(13)+char(10) print @DELETEgo exec sp_ms_marksystemobject 'CurdSqlString'--添加在系統存儲過程目錄 go
2、創建表Tab1
e.g.
USE [test] GO/****** Object: Table [dbo].[Tab1] Script Date: 2016/5/6 11:51:47 ******/ IF OBJECT_ID('Tab1','U') IS NOT NULL DROP TABLE [dbo].[Tab1] GO CREATE TABLE [dbo].[Tab1]([ID] [BIGINT] NULL,[Name] [sysname] NOT NULL ) ON [PRIMARY]GO3、調用方法:
--調用方法: exec CurdSqlString 'Tab1'-- 表名顯示效果:
USE test Go if OBJECT_ID('cTab1','P') is not nullDROP PROC [cTab1] Go /**************************************************************************************************************************************************************** %%存儲過程名:cTab1%%輸入參數:@ID,@Name%%輸出參數:%%功能:新增記錄在表Tab1 **************************************************************************************************************************************************************** %%編寫:Roy 2016-05-06****************************************************************************************************************************************************************/ CREATE PROCEDURE cTab1(@ID bigint,@Name sysname) AS INSERT INTO dbo.Tab1([ID],[Name]) VALUES(@ID,@Name) Go if OBJECT_ID('uTab1','P') is not nullDROP PROC [uTab1] Go /**************************************************************************************************************************************************************** %%存儲過程名:uTab1%%輸入參數:@ID,@Name%%輸出參數:%%功能:修改記錄在表Tab1 **************************************************************************************************************************************************************** %%編寫:Roy 2016-05-06****************************************************************************************************************************************************************/ CREATE PROCEDURE uTab1(@ID bigint,@Name sysname) AS UPDATE dbo.Tab1 SET [Name]=@Name WHERE [ID]=@ID Go if OBJECT_ID('rTab1ByID','P') is not nullDROP PROC [rTab1ByID] Go /**************************************************************************************************************************************************************** %%存儲過程名:rTab1ByID%%輸入參數:@ID bigint%%輸出參數:%%功能:根據條件讀取記錄在表Tab1 **************************************************************************************************************************************************************** %%編寫:Roy 2016-05-06****************************************************************************************************************************************************************/ CREATE PROCEDURE rTab1ByID(@ID bigint) AS SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT [ID],[Name] Fromdbo.Tab1 WHERE[ID]=@ID Go if OBJECT_ID('rTab1ForAll','P') is not nullDROP PROC [rTab1ForAll] Go /**************************************************************************************************************************************************************** %%存儲過程名:rTab1ForAll%%輸入參數:%%輸出參數:%%功能:讀取記錄在表Tab1 **************************************************************************************************************************************************************** %%編寫:Roy 2016-05-06****************************************************************************************************************************************************************/ CREATE PROCEDURE rTab1ForAll AS SET NOCOUNT ON; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT [ID],[Name] Fromdbo.Tab1 Go if OBJECT_ID('dTab1','P') is not nullDROP PROC [dTab1] Go /**************************************************************************************************************************************************************** %%存儲過程名:dTab1%%輸入參數:%%輸出參數:@ID bigint%%功能:刪除記錄在表Tab1 **************************************************************************************************************************************************************** %%編寫:Roy 2016-05-06****************************************************************************************************************************************************************/ CREATE PROCEDURE dTab1(@ID bigint) AS DELETE dbo.Tab1 WHERE [ID]=@ID Go?
?
轉載于:https://www.cnblogs.com/Roy_88/p/5473840.html
總結
以上是生活随笔為你收集整理的SQL Server开发接口生成方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到开车掉河里是什么意思
- 下一篇: 在VisualStadio2015上使用