数据库规范文档格式.docx
- 文档编号:22073208
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:21
- 大小:50.25KB
数据库规范文档格式.docx
《数据库规范文档格式.docx》由会员分享,可在线阅读,更多相关《数据库规范文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
灰色字体的变量类型暂没有定义前缀,如需要使用,请通知主管来确定此部分的定义,再行使用
变量类型
前缀
bit
b
int
tinyint
smallint
bigint
decimal
numeric
n
char
nchar
varchar
nvarchar
str
datetime
smalldatetime
timestamp
dt
binary
image
money
ntext
real
smallmoney
sql_variant
text
uniqueident
varbinary
1.6编码格式
▲新建Table
新建Table,及新增的字段,其字段名必须有明确的含义。
▲StoreProcedure编辑器的设置
设置每个Tab键对应4个空格,字体为宋体,SIZE为10。
▲用Tab键来对齐行与行之间的文字,语句中的每个逻辑符号左右都填加一个空格,如:
SELECT(一个Tab键距离)@_nWOQty(一个空格)=(一个空格)workorderqty
FROM(一个Tab键距离)mfworkorder(一个空格)(NOLOCK)
WHERE(一个Tab键距离)PackingCode(一个空格)=(一个空格)@_strPackingCode
▲在使用目前已经RUN在产线的Table,其字段名含义不清的,在使用时须加注释。
▲T-SQL命令的编写格式如下:
①Select语句﹕
<
一个Tab键距离>
SELECTfieldname1[ASname1],
若干个Tab键与上行列名对齐>
fieldname2[ASname2],
Fieldname3[ASname3],
…
FROMTableName1[AliasName1](NOLOCK),
TableName2[AliasName2](NOLOCK)
WHEREcondition1=Value1
<
若干个Tab键与上行表达式对齐>
ANDcondition2=Value2
……
或
FROMTableName1[AliasName](NOLOCK)
若干个Tab键与上行表名对齐>
[INNERJOINTableName1]
[ON<
conditionexpression1>
<
AND<
conditionexpression2>
…
]
ANDcondition2=Value2
当Select存在关联表查询时,需用INNERJOIN等写法,如下:
SELECTTname1.fieldname1[ASname1],
FROMTableName1ASTname1(NOLOCK)
INNERJOINTableName2ASTname2(NOLOCK)
ONTName1.fieldname1=Tname2.fieldname1
ANDTName1.fieldname2=Tname2.fieldname2
2Update语句﹕
UPDATETableNameWITH(ROWLOCK)
SETfieldname1<
用Tab键对齐等号>
=Value1
fieldname2<
=Value2
fieldname3<
=Value3
……
WHEREcondition1=Value1
当Update语句的条件存在含义不明字段的情况时,需加一个条件,判断该字段值不能为‘’或NULL,如下:
WHEREcondition1IN
(
SELECTb.sysserialno
FROMmfsysproductASa(NOLOCK)
INNERJOINmfsysproductb(NOLOCK)
ONa.field1=b.field1
ANDISNULL(a.field1,’’)<
>
’’
ANDa.sysserialno=Value4
)
……
3Insert语句﹕
INSERTTablename
(
<
二个Tab键距离>
fieldname1,
fieldname2,
fieldname3,
VALUES
Value1,<
用Tab键对齐右边的字段名>
--fieldname1
Value2,<
--fieldname2
Value3,<
--fieldname3
在每个Value后用注释的方式加上对应的字段名,虽然会增加一些code量,但这样不需要先找出字段对应的位置,再到Value中按位置查找,方便每个人的阅读。
1.7返回值
每个Storeprocedure都要有返回值。
如果正常完成﹐返回0;
如果出错﹐要返回@@error,以方便检查Storeprocedure是否出错。
1.8调用其它SP
在一个Storeprocedure内部调用另外一个Storeprocedure时,要严格按照参数名=参数值的格式进行编写。
例如﹕
EXEC@_intErr=GenerateNo
EXEC@_nErr=GenerateNo
@strSeqNoName='
ReceiveNo'
@strNewNo=@_strReceiveNoOUTPUT<
调用另外一个SP时一定要判断返回值,判断出有错误则要RollbackTransaction。
例如:
DECLARE@_nIMTransNoCHAR(20)
EXEC@_itrErn=GenerateNo'
IMTrans'
@_IMTransNooutput,'
SeqNo'
1
EXEC@_nErn=GenerateNo'
@_strIMTransNooutput,'
SET@_nErn=CASEWHEN@@ERROR<
0THEN@@ERRORELSE@_nErnEND
IF@_nErn<
0
BEGIN
IF@@TRANCOUNT=1
ROLLBACKTRAN@_strTransName
END
ELSEIF@@TRANCOUNT>
1
COMMITTRAN@_strTransName
RETURN@_nErn
2.Transaction要注意的问题
2.1在Transaction中每个update或Insert后面必须Check@@error,,如果@@error不等于0﹐则要RollbackTransaction。
2.2在一个Transaction中尽可能不要多次update同一个Table,以免出现deadlock现象。
2.3如果opendatasource语句是连接其它的DB﹐那么不能用在Transaction中。
2.4在嵌套的Transaction中﹐在里层的Transaction出错时﹐RollbackTransaction的处理如下﹕
ROLLBACKtransname
COMMITtransname
原因﹕
1)在SQLServer的嵌套Transaction中﹐内层Transaction的Rollback和Commit会被外层Transaction所忽略﹐从而随外层Transaction的Rollback而Rollback﹐Commit而Commit。
2)在SQLServer的嵌套Transaction中﹐Rollback所用到的transactionname只能是外层Transaction的transactionname﹐如果是内层Transaction用了自己transactionname进行Rollback﹐SQLServer认为是非法的。
当Rollback的transactionname是外层Transaction的transactionname﹐甚至是没有transactionname﹐内外层的Transaction都会给Rollback。
3.变量的初始化
SQLServer会将变量初始化成缺省值NULL。
如果在SELECT语句中向一个变量赋值,但又没有查找到符合条件的记录,则此变量值仍为NULL。
如果在后面继续使用这个变量,则可能会因为处理不当而产生未知的错误。
例1:
在SELECT语句前没有初始化变量
DECLARE@_strSSNVARCHAR(20)
SELECT@_strSSN=sysserialno
FROMmfsysproduct(NOLOCK)
WHEREsysserialno='
XXXXXXX'
If@_strSSN=‘’
如果mfsysproduct中不存在sysserialno为’XXXXXXX’的记录,在执行完SELECT语句后,变量@_strSSN的仍为NULL。
例2:
FROMmfsysproduct(NOLOCK)
2UA6030001'
SELECT@_strSSN
如果存在'
的记录,则执行完第一个SELECT语句后,变量@_strSSN的值为'
。
的记录,则执行完第二个SELECT语句后,@_strSSN的值为'
;
如果不存在'
的记录,@_strSSN的值应变为空串或是NULL,表示没有查找到相应记录,但因为变量没有重新初始化,@_strSSN的值仍为最后一次的赋值'
正确的语句为:
DECLARE@_strSSNVARCHAR(20)
SET@_strSSN='
'
SELECT@_strSSN=sysserialno
FROMmfsysproduct(NOLOCK)
WHEREsysserialno='
SELECT@_strSSN
WHEREsysserialno='
4.Coding过程中要注意的问题
4.1不要直接在EnterpriseManager编辑storeprocedure。
4.2更View,storeprocedureFunction的正确格式如下﹕
1)先删除后创建
2)
4.3不要在WHERE语句后使用UserDefinedFunction。
4.4不要在SELECT语句返回的结果集中使用太多的UserDefinedFunction。
4.5不要在SELECT语句中使用*,对每个Table要加上WITH(NOLOCK)。
4.6在WHERE语句后,小范围的约束条件要放在大范围的约束条件前。
4.7对整数来说,要用integer类型替代float类型表示一个整数。
4.8复合查询的SQL语句要尽可能使用innerjoinorouterjoin
4.9如果有声明Label,则Label处必须有其它语句或命令﹐否则系统认为Label是一个条件从而报错。
4.10字符串比较应明确是否大小写无关,如果大小写无关,应统一转成大写或小写后再去比较。
4.11SP中会出现循环往某个表插入数据,那要求先将数据插入到一个临时表中,当执行完后,在一次性插入到该要插入的表中.
5.嵌套调用SP及判断是否有执行错误的问题
5.1嵌套调用SP使用语句:
EXEC@_nError=被嵌套的SPName参数名=参数值
Ø
一定要有接受被嵌套调用的SP返回的错误代码的变量
在指定SP参数时一定要指定对应参数名,以防SP参数顺序或个数被修改后会出现不可预期的错误。
5.2由1点可得知:
嵌套调用SP时被嵌套的SP一定要有RETURN值,否则调用的SP是不会知道是否有执行的错误的.
5.3在判断被嵌套的SP是否有执行错误时要考虑到:
SP还未执行就出现错误的问题(因为SP还未执行则:
@_nError永远会等于0,只有系统变量@@ERROR才会有错误代码).即:
在判断是否有错误时还需判断系统变量@@ERROR是否不为0。
如:
@_strIMTransNooutput,'
1
IF(@_nErr=0)
COMMITTRAN@_strTransName
ELSE
IF@@TRANCOUNT=1
BEGIN
ROLLBACKTRAN@_strTransName
END
ELSEIF@@TRANCOUNT>
COMMITTRAN@_strTransName
RETURN@_nErr
6.Coding逻辑原则
遵循以下原则将在一定程度上帮助你避免程序出现一些不容易发现的Bug。
6.1使用SELECT语句查询出来值进行大小判断时,必须保证SELECT返回的值只有一个,否则将出现错误。
即:
尽量使用主键字段进行查询,如不能保证则应视情使用:
TOP1、MIN、MAX函数等。
6.2使用类似INSERTINTOxxxWITH(ROWLOCK)SELECT…FROMxxxWITH(NOLOCK)语句进行批次往某Table新增记录时,请确认你SELECT出来的记录不会违反目的表的主键及唯一索引原则。
建议使用GROUPBY主键来预防此种情况产生,如不能则视情使用TOP1、MIN、MAX函数等。
6.3若在不同代码段中返回的结果集被用在同一客户端的同一UI元素中或同一逻辑处理中,那么如果一处结果集被修改或客户端处理逻辑所需结果集结构需要修改,则所有返回该结构结果集之处皆需进行修改。
6.4如果对某种数据做处理需要加一标识来表示是否做过处理,那么与此类数据相关的数据也需要做类似处理的话,则必须为其增加一标识来表示是否做过相关处理。
WebOwnershipChange(ShippingOut)报表产生数据时只产生有BatchGRI标记的数据,如果在上传SAP时不去判断有没有BatchGRI过就上传SAP就会导致Web丢失那些没有BatchGRI就被上传的记录。
6.5缺省的,定义后的变量在没有赋值前,其缺省值为NULL。
当使用一个SELECT语句想为变量赋值,但这个查询语句却没有找到任何与条件相符的记录,则此变量的值将不会被改变仍然为NULL。
所以在使用变量前,要初使化变量为一个非NULL的缺省值。
DECLARE@_strStringCHAR(20)
SET@_strString='
SELECT@_strString=workordernoFROMmfworkorder(NOLOCK)
WHEREworkorderno='
somenon-existingWOcausinganullreturnvalue'
OR
DECLARE@_strStringCHAR(20)
SELECT@_strString=ISNULL(workorderno,’’)
FROMmfworkorder(NOLOCK)
6.6应对所取到的数据进行有效性的判断和处理:
如,一个变量取值后仍是NULL,则可以将其置为空字符串以便后面对该变量进行判断和处理。
6.7对于一次数据处理应尽量判断其所处理的记录个数,并针对不同情况做出处理。
6.8如果无法确定一个否定条件表达式(NOTLIKE)包含有多少种情况,则应该用肯定条件表示式。
6.9在WHERE条件中,变量的类型要跟tablefield的类型相符。
虽然系统会自动做类型转换,但会造成不必要的系统开销。
字段repairheld字段的类型为BIT,则正确的写法应为:
select*frommfwokstatus(nolock)whererepairheld=1
SELECT*FROMmfwokstatus(NOLOCK)WHERErepairheld=1
错误的写法例如:
select*frommfwokstatus(nolock)whererepairheld=‘1’
SELECT*FROMmfwokstatus(NOLOCK)WHERErepairheld=‘1’
6.10常用的检查数据或查询数据的逻辑,尽量用UserDefinedFunction实现,这样方便其它模块的调用,又利于日后的功能扩充及维护。
6.11每个StoredProcedure的代码要尽量短小、精悍,只实现指定的功能,这样当StoredProcedure需要被SQLServerre-compile的时候,在极短的时间内即可完成。
切记:
不要将处理不同功能的代码都放在一个StoredProcedure中,这样可能会引起SQLServer频繁地花费较多的时间compile这个StoredProcedure,在调用此SP的时候会花费很长的时间等待,并会严重影响SQLServer的性能。
6.12如果DB端与客户端同时被发布,则需要确认先发布DB端是否会影响到现有客户端的运行。
如果一定需要客户端更新,则在DB端进行检查,并提示用户更新程序。
6.13在SP的头部尽量加入SETNOCOUNTON,在尾部加入SETNOCOUNTOFF.
6.14在IF语句中,参数条件为空的表达式写法不再采用OR的写法,而采用ISNULL()函数来判定。
正确的写法为:
IFISNULL(@orderno,'
)='
错误的写法为:
IF@orderno='
OR@orderno=NULL
6.15在将从数据库中提取出来的值,赋值给参数时,应尽量避免直接对数据库中的字段进行操作,这样会影响查询的效率及系统的响应速度,也会造成不必要的系统开销,因此应先将字段的相关值赋值给变量,再直接对变量进行操作,以提高系统执行效率。
例如,编写带参数的select语句时,尽量避免在select中写自定义函数给参数赋值。
SELECT@orderno=c.orderno,
@packageNo=c.packageno
FROMmfworkorderc(NOLOCK)......
SET@orderno=dbo.fn_Trim(@orderno)
SET@packageNo=dbo.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 规范