如何select一个table的默认值?

How to select the default values of a table?

在我的应用程序中,当让用户输入新记录时,我想预select数据库的默认值。

让我们举个例子 table:

CREATE TABLE pet (
    ID INT NOT NULL,
    name VARCHAR(255) DEFAULT 'noname',
    age INT DEFAULT 1
)

我想做这样的事情:

SELECT DEFAULT VALUES FROM pet -- NOT WORKING

应该return:

ID   | name   | age
--------------------
NULL | noname | 1

然后我会让用户填写剩余的字段,或者让她更改其中一个默认值,然后再点击“保存”。

如何使用 tsql select sql 服务器 table 的默认值?

您不“SELECT”默认值,只插入它们。 SELECT returns 来自 table 的行,你不能 SELECT DEFAULT VALUES 因为 table 中没有这样的行。 =22=]

你可以做一些愚蠢的事情,比如使用TRANSACTION然后回滚,但是ID没有默认值,并且你没有用 DEFAULT VALUES 为它定义一个值,它会在你的场景中失败:

CREATE TABLE pet (
    ID INT NOT NULL,
    name VARCHAR(255) DEFAULT 'noname',
    age INT DEFAULT 1
)
GO

BEGIN TRANSACTION;

INSERT INTO dbo.pet
OUTPUT inserted.*
DEFAULT VALUES;

ROLLBACK;

Msg 515, Level 16, State 2, Line 13 Cannot insert the value NULL into column 'ID', table 'Sandbox.dbo.pet'; column does not allow nulls. INSERT fails.

因此,您可以只提供非 NULL 列的值:

BEGIN TRANSACTION;

INSERT INTO dbo.pet (ID)
OUTPUT inserted.*
VALUES(1);

ROLLBACK;

这将输出“默认”值:

ID|name  |age
--|------|---
 1|noname|1

选择所有列的默认值并不是很简单,正如 Heinzi 在他的评论中所写 - 确实需要您通常不希望用户拥有的权限级别。

也就是说,一个简单的解决方法是插入一条记录,select 返回并显示给用户,让用户决定他们想要更改的内容(如果有的话),然后在他们提交时记录 - 更新记录(或删除以前的记录并插入新记录)。

如果用户实际查看和更新​​了记录,则需要您提供一些指示,但这很容易完成,只需添加一个位列并在更新数据时将其设置为 1。

正如我之前评论过的。不需要此查询,因为您可以在 Management Studio 编辑器中的任何 table 上按 alt + f1 并为您提供 table.

所需的所有信息
select sys1.name 'Name',replace(replace(
        case
            when object_definition(sys1.default_object_id) is null then 'No Default Value'
            else object_definition(sys1.default_object_id)
        end ,'(',''),')','') 'Default value',
        information_schema.columns.data_type 'Data type'
        from   sys.columns as sys1
        left join information_schema.columns on sys1.name = information_schema.columns.column_name
        where  
        object_id = object_id('table_name')
        and information_schema.columns.table_name = 'table_name'

看来这可能是解决方案:

SELECT * FROM (
   SELECT
    sys1.name AS COLUMN_NAME,
    replace(replace(object_definition(sys1.default_object_id),'(',''),')','') AS DEFAULT_VALUE
FROM sys.columns AS sys1
     LEFT JOIN information_schema.columns ON sys1.name = information_schema.columns.column_name
WHERE object_id = object_id('pet')
  AND information_schema.columns.table_name = 'pet'
) AS SourceTable PIVOT(MAX(DEFAULT_VALUE) FOR COLUMN_NAME IN(ID, name, age)) AS PivotTable;

它returns:

ID  |name  |age
----|------|---
NULL|noname|1

可能列类型不正确 - 但也许我可以接受。 感谢@Nissus 为此提供中间步骤。