如果从应用程序运行,SELECT返回NULL

时间:2018-04-17 08:45:51

标签: sql-server tsql sql-server-2005

我在使用VIEW_METADATA创建的视图上有一个INSERT触发器。 有以下片段:

    if @has_folder is null set @has_folder=(select REPLACE(REPLACE(REPLACE(COLUMN_DEFAULT, '(', ''), ')', ''), '''', '') from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'people' and COLUMN_NAME = 'has_folder')

此子查询的要点是将@has_folder设置为列的默认值(如果为NULL)。并且如果默认更改,则避免编辑触发器文本。由于默认值存储在由双括号('((0))')包围的DB中,因此我将其删除。

当我从SQL Server Management Studio运行INSERT时它确实有效,但是当从应用程序运行相同的查询时它不起作用(@has_folder保持为NULL)。查询是一样的,我已经用SQL Profiler检查了。

如果我将语句设置为

    if @has_folder is null set @has_folder=0

它有效,但如果我决定更改数据库中该列的默认值,我将不得不手动更改它。

一般来说,

select COLUMN_DEFAULT from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'people' and COLUMN_NAME = 'has_folder'
如果从SSMS运行,

返回正确的值,但如果从应用程序运行则返回NULL。

显示相同的行为
select definition from sys.columns 
join sys.tables on sys.columns.object_id = sys.tables.object_id
join sys.default_constraints on sys.default_constraints.object_id = default_object_id
where sys.columns.name = 'has_folder'
and sys.tables.name = 'people'

发生了什么以及如何解决?

1 个答案:

答案 0 :(得分:0)

尝试这种方法

SELECT
    @has_folder = COALESCE(@has_folder,
                       (
                          SELECT 
                             REPLACE(REPLACE(REPLACE(COLUMN_DEFAULT, '(', ''), ')', ''), '''', '')
                             FROM INFORMATION_SCHEMA.COLUMNS
                                WHERE TABLE_NAME = 'people'
                                    AND COLUMN_NAME = 'has_folder'
                       ),
                       0
                    )