admin

在存储过程中使用列的默认值

sql

我正在使用SQL Server 2012,并且具有2个具有以下定义的表

CREATE TABLE t1 (id INT PRIMARY KEY, value NVARCHAR(10))
CREATE TABLE t2 (id INT PRIMARY KEY, value BIT DEFAULT 1)

ALTER TABLE t2 WITH CHECK ADD CONSTRAINT FK FOREIGN KEY(id) REFERENCES t1 (id)

我为当前示例插入了以下各列:

INSERT INTO t1 VALUES (1, 'a')
INSERT INTO t1 VALUES (2, 'b')
INSERT INTO t1 VALUES (3, 'c')

INSERT INTO t2 VALUES (1, 1)
INSERT INTO t2 VALUES (3, 0)

我正在运行此查询,它可以工作

SELECT
  t1.*, ISNULL(t2.value, 1)
FROM
  t1
  LEFT JOIN t2 ON t1.id = t2.id

有什么方法可以用我在表的列中定义的默认值替换1这部分中的?ISNULL(t2.value, 1)``value``t2

这是我通过此示例创建的sqlfiddle: [SQLFIDDLE DEMO](http://sqlfiddle.com/#!6/e41b0e/1)


阅读 140

收藏
2021-06-07

共1个答案

admin

您没有按照预期的方式使用默认值。这是SQL Server在插入时进行内部评估的内容(如果使用default关键字,则可能会进行更新)。

不适用于SELECT。考虑它可以包含任意表达式,例如DEFAULT CAST(GETDATE() AS INT) % 2或调用Scalar
UDF。从字符串到位的转换不会为您评估这些表达式。

您可以执行此操作的唯一方法是分别对其进行评估

DECLARE @B            BIT
        , @Definition NVARCHAR(max)

SELECT @Definition = N'SELECT @B = '
                     + object_definition(default_object_id)
FROM   sys.columns
WHERE  NAME = 'value'
       AND object_id = OBJECT_ID('dbo.t2')

EXEC sys.sp_executesql
  @Definition,
  N'@B BIT OUTPUT',
  @B = @B OUTPUT

SELECT t1.*,
       ISNULL(t2.value, @B)
FROM   t1
       LEFT JOIN t2
              ON t1.id = t2.id
2021-06-07