我正在使用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
1
ISNULL(t2.value, 1)``value``t2
这是我通过此示例创建的sqlfiddle: [SQLFIDDLE DEMO](http://sqlfiddle.com/#!6/e41b0e/1)
[
](http://sqlfiddle.com/#!6/e41b0e/1)
您没有按照预期的方式使用默认值。这是SQL Server在插入时进行内部评估的内容(如果使用default关键字,则可能会进行更新)。
default
不适用于SELECT。考虑它可以包含任意表达式,例如DEFAULT CAST(GETDATE() AS INT) % 2或调用Scalar UDF。从字符串到位的转换不会为您评估这些表达式。
SELECT
DEFAULT CAST(GETDATE() AS INT) % 2
您可以执行此操作的唯一方法是分别对其进行评估
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