2015-05-11 181 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