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 null
DROP PROC Curdsqlstring
go
CREATE PROCEDURE Curdsqlstring(
@TableName sysname
)
with encryption
AS
if OBJECT_ID(@TableName,'U') is null
return 0
DECLARE @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)+')' end
when 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 1
FROM sys.objects x
JOIN sys.indexes y ON x.type = N'PK'
AND x.name = y.name
JOIN sysindexkeys z ON z.id = x.object_id
AND z.indid = y.index_id
AND 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_id
IF @IdentityWHERE = ''
SELECT @IdentityWHERE = @IdentityWHERE+CASE WHEN @IdentityWHERE > '' AND EXISTS ( SELECT 1
FROM sys.objects x
JOIN sys.indexes y ON x.type = N'PK'
AND x.name = y.name
JOIN sysindexkeys z ON z.id = a.object_id
AND z.indid = y.index_id
AND z.colid = a.Column_id ) THEN ' AND '
ELSE ''
END
+ CASE WHEN EXISTS ( SELECT 1
FROM sys.objects x
JOIN sys.indexes y ON x.type = N'PK'
AND x.name = y.name
JOIN sysindexkeys z ON z.id = a.object_id
AND z.indid = y.index_id
AND z.colid = a.Column_id )
THEN QUOTENAME(name) + '=' + '@' + name
ELSE ''
END
FROM sys.columns AS a
WHERE object_id = OBJECT_ID(@TableName)
ORDER BY column_id
IF @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 END
SELECT @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 @DELETE
go
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] GO
3、调用方法:
--调用方法:
exec CurdSqlString 'Tab1'-- 表名
显示效果:
USE test
Go
if OBJECT_ID('cTab1','P') is not null
DROP 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 null
DROP 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 null
DROP 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]
From
dbo.Tab1
WHERE
[ID]=@ID
Go
if OBJECT_ID('rTab1ForAll','P') is not null
DROP 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]
From
dbo.Tab1
Go
if OBJECT_ID('dTab1','P') is not null
DROP PROC [dTab1]
Go
/****************************************************************************************************************************************************************
%%存储过程名:dTab1 %%输入参数: %%输出参数:@ID bigint %%功能:删除记录在表Tab1
****************************************************************************************************************************************************************
%%编写:Roy 2016-05-06 ****************************************************************************************************************************************************************/
CREATE PROCEDURE dTab1
(@ID bigint)
AS
DELETE dbo.Tab1 WHERE [ID]=@ID
Go
SQL Server开发接口生成方法的更多相关文章
- Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程
原文:Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程 Red Gate系列之三 SQL S ...
- 删除SQL Server大容量日志的方法(转)
删除SQL Server大容量日志的方法 亲自实践的方法 1.分享数据库,如果提示被其他连接占用,不能分离,刚勾上drop connections 2.复制下所有文件,一定要备份好,以防自己操作失误 ...
- SQL Server镜像自动生成脚本
SQL Server镜像自动生成脚本 镜像的搭建非常繁琐,花了一点时间写了这个脚本,方便大家搭建镜像 执行完这个镜像脚本之后,最好在每台机器都绑定一下hosts文件,不然的话,镜像可能会不work 1 ...
- C#将图片存放到SQL SERVER数据库中的方法
本文实例讲述了C#将图片存放到SQL SERVER数据库中的方法.分享给大家供大家参考.具体如下: 第一步: ? 1 2 3 4 5 6 7 8 9 10 //获取当前选择的图片 this.pictu ...
- SQL Server存储过程的删除方法
SQL Server存储过程的删除方法使我们经常会用到的,下面就为您介绍扩展存储过程的删除方法,如果您对SQL Server存储过程方面感兴趣的话,不妨一看. --清除SQL Server所有的危险扩 ...
- [转]SQL SERVER数据库还原的方法
SQL SERVER数据库还原的方法 在SQL SERVER 2005下还原数据库 1.新建数据库A,右键还原数据库,此时目标数据库为A,选择备份 文件B_db_201311040200.BAK,还原 ...
- SQL Server修改标识列方法(备忘)
原文:SQL Server修改标识列方法(备忘) SQL Server修改标识列方法 ----允许对系统表进行更新 exec sp_configure 'allow updates',1 reconf ...
- Update导致SQL Server死锁的典型方法(转载)
此文为转载文章,描述的很好,没有验证过. 最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个 ...
- 1. SQL Server服务器监控实现方法
对于服务器的监控,和对数据库的监控,很少有合二为一的工具,如果有的话,一般是付费软件,或者自行开发的工具.所以如果不想购买软件,也不想花精力去开发的话,可以结合一些免费/开源的工具.自定义脚本,来完成 ...
随机推荐
- 【Linux_Fedora_应用系列】_2_如何安装视频播放器和视频文件解码
在前面的一篇博文中,我们进行了音乐播放器的安装和解码器的安装.[Linux_Fedora_应用系列]_1_如何安装音乐播放器和mp3解码 这里我们来进行视频播放器的安装.我们还是通过yum方式安装. ...
- 第 22 章 CSS3 渐变效果
学习要点: 1.线性渐变 2.径向渐变 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 背景渐变功能,主要有两种渐变方式:线性渐变和径向(放射性)渐变. 一.线性渐变 CSS3 提供了 li ...
- 解决WindowsServer 2008 R2 未注册版一个小时自动强制关机
仅用来学习交流,请大家购买正版,尊重正版版权. 安装了win2008R2,试了很多激活方法,终于激活后,不知道什么原因,过了一段时间后,每隔一段时间就自动关机,查了一下,发现是 wlms.exe在作祟 ...
- Git修改提交的用户名和Email
git config --global user.name "Your Name" git config --global user.email you@example.com
- Walkway.js – 用线条制作简约的 SVG 动画
Walkway.js 是一个使用线条和路径元素组成 SVG 动画图像的简单方法.只需根据提供的配置对象创建一个新的 Walkway 实例就可以了.这种效果特别适合那些崇尚简约设计风格的网页.目前, W ...
- Ubuntu 各版本代号简介
起名字是件伤脑筋的事,但是程序猿们似乎最喜欢干伤脑筋的活.Android 的每个版本都有个甜点的别名,而 Ubuntu ,每个版本都有一个更为特色的名字,这个名字由一个形容词和一个动物名称组成,并且, ...
- Titanium中调用ios组件时语言不是本地化的解决方法
用Titanium开发的ios应用中,当调用系统组件时,尽管手机已经设置了系统语言为中文,但那些组件的界面却仍为英文.比如调用iphone中的相册组件,其界面为: 那么怎么让它跟系统语言保持一致呢? ...
- 小白的CSS基础学习
CSS定义: CSS全称为“层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML内容在浏览器内的显示样式. CSS代码语法: css样式选择组成部分:选择符+声明( ...
- JS与一般处理程序之间传值乱码
好久没用到,突然遇到此问题还用了点时间. 在JS里面通过URL向Handler传中文值的时候,在Handler里面取值出来后会发现是乱码的~~.这就需要个编码解码过程.(先记录自己遇到的一个方面的解决 ...
- 【移动适配】一个像素的border怎么实现
一个像素里复杂纷扰的世界 文 | 啃先生 Mar.3rd.2016 首发于微信公众号(啃先生) 上一篇发了<[移动适配]移动Web怎么做屏幕适配> 壹 | Fisrt 在CSS的世界里P ...