Sql server SQL Server默认值:为什么用一个或两个括号?
如果运行此脚本以检索数据库中的所有默认值定义:Sql server SQL Server默认值:为什么用一个或两个括号?,sql-server,tsql,Sql Server,Tsql,如果运行此脚本以检索数据库中的所有默认值定义: select c.name as columnname, t.name as tablename, d.definition as value, d.name as constraintname from sys.default_constraints d join sys.columns c on d.parent_column_id = c.column_id and d.pa
select
c.name as columnname, t.name as tablename,
d.definition as value, d.name as constraintname
from
sys.default_constraints d
join sys.columns c
on d.parent_column_id = c.column_id
and d.parent_object_id = c.object_id
join sys.tables t
on c.object_id = t.object_id
您将获得许多默认值,如:
(getdate())
((0))
('')
('2099-12-31')
我的问题是,为什么会有括号?它们是必要的吗?为什么有些值有一对,而另一些值有两对?编写T-SQL脚本时是否要精确地遵循计数?这只是SQL在内部存储它们的方式 除非由于某种原因,中的
扩展为(…或…
),否则不需要它们
您应该使用and和OR尝试检查约束。老天爷。够了。然而,FWIW,我注意到一种模式,至少在我的数据库中,当SQLServer将默认值存储在单括号和双括号中时是这样的
- 数字的双括号(在我的例子中是所有整数)
- 非数字的单括号(即字符串和函数)
- 所有定义至少存储在一组括号中
- 没有存储在两组以上括号中的定义
虽然这可能不会影响功能等,但作为程序员,知道有一种模式感觉很好
下面是一个根据这些规则检查数据库默认值的查询(这可能并不完美,但只是一个开始)
我检查了一些数据库,这些规则仍然有效。然而,我想看看其他人是否也看到了同样的结果。有趣的是(至少)
显示没有任何括号的TSQL
CREATE TABLE dbo.doc_exz (
column_a INT,
column_b INT DEFAULT 50);
CREATE TABLE dbo.doc_exz (
column_a INT,
column_b INT DEFAULT 50);