代码之家  ›  专栏  ›  技术社区  ›  slartidan

如何选择表的默认值?

  •  1
  • slartidan  · 技术社区  · 4 年前

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

    让我们以这张表为例:

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

    我想做这样的事情:

    SELECT DEFAULT VALUES FROM pet -- NOT WORKING
    

    它应该返回:

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

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

    如何使用tsql选择sqlserver表的默认值?

    2 回复  |  直到 4 年前
        1
  •  2
  •   Thom A    4 年前

    你不知道 SELECT “默认值,只插入它们。A 选择 返回表中的行,您不能 选择 这个 DEFAULT VALUES 因为桌子里没有这样的行。

    你可以的 某物 愚蠢的,喜欢使用 TRANSACTION 并将其回滚,但作为 ID 没有默认值,也没有为其定义值 默认值 ,它将在您的场景中失败:

    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;
    

    消息515,级别16,状态2,第13行 无法将值NULL插入到表“Sandbox.dbo.pet”的列“ID”中;列不允许为空。INSERT失败。

    因此,您可以只提供非参数的值- NULL 柱:

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

    这将输出“默认”值:

    ID|name  |age
    --|------|---
     1|noname|1
    
        2
  •  2
  •   Zohar Peled    4 年前

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

    也就是说,一个简单的解决方法是插入一条记录,将其选中并显示给用户,让用户决定他们想要更改什么(如果有的话),然后在提交记录时更新记录(或删除之前的记录并插入新的记录)。

    这将要求您了解用户是否实际查看和更新了记录,但这很容易实现,只需在更新数据时添加一个位列并将其设置为1即可。

        3
  •  1
  •   Nissus    4 年前

    正如我之前所评论的那样。无需进行此查询,因为您可以在Management Studio编辑器中的任何表上按alt+f1,并为您提供该表所需的所有信息。

    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'
    
        4
  •  1
  •   slartidan    4 年前

    这似乎是一个解决方案:

    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;
    

    它返回:

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

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