2015-05-11 133 views
2

我使用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)与我在表t2value列中定义的默认值?

下面是我用这个例子创建的sqlfiddle:SQLFIDDLE DEMO

更新1:
我不能使用SQL Server: Find out default value of a column with a query因为它返回((1)),我不能投((1))BIT。 有什么办法解决这个问题吗?

+0

你的意思是你想更换1't1.value'? – Siyual

+0

不,我不知道。 't2'中的'value'列有一个默认值(在本例中为'1')。我想在存储过程中使用该默认值而不是硬编码1,因为如果将默认值更改为0,我不想更改每个存储过程。 – CrApHeR

+0

我不明白这个查询 - 那么你想采用't2.value',除非它是'NULL',并且如果它是'NULL',则采取...'t2.value'?这没有任何意义。 – Siyual

回答

1

您没有使用意图的方式的缺省值。这是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 
+0

此方法是安全的,因为在SQL Server引擎中有一个评估返回结果并且没有字符串替换。 – CrApHeR

0

这个工作对我来说:

DECLARE @def as bit = null 

SELECT @def 
UNION ALL 
SELECT ISNULL(@def, REPLACE(REPLACE((
    SELECT COLUMN_DEFAULT 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = 'dbo' 
     AND TABLE_NAME = 'dual' 
     AND COLUMN_NAME = 'tempo'),'(', ''), ')', '')) As def 
+0

我已经在我的问题的评论区域中评论过这种可能性(替换括号),但是我正在寻找一种干净而安全的方式来获取值。 – CrApHeR