我在使用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'
发生了什么以及如何解决?
答案 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
)