【发布时间】:2018-09-27 03:43:24
【问题描述】:
我在使用 VIEW_METADATA 创建的视图上有一个 INSERT 触发器。 有以下sn-p:
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。并避免在默认更改时编辑触发文本。由于默认值存储在 DB 中,由双括号 ('((0))') 包围,因此我将其删除。
当我从 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'
发生了什么以及如何解决?
【问题讨论】:
-
你确定引号没有弄乱吗?
-
@WhatsThePoint 你是什么意思?
-
这个问题暗示我您已将查询粘贴到您的应用程序中,如果是这种情况,所有替换中的引号可能会搞砸
-
@WhatsThePoint 不,我没有将查询粘贴到我的应用程序中。引用的查询包含在 INSERT 进入视图后触发的 DB 触发器中。
-
如果它被调用,暂时修改触发器只是为了记录可能是值得的
标签: sql-server tsql sql-server-2005