【问题标题】:SELECT returns NULL if run from application如果从应用程序运行 SELECT 返回 NULL
【发布时间】: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


【解决方案1】:

试试这个方法

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
                    )

【讨论】:

  • 我删除了 COALESCE (, 0) 的最后一个参数,因为我不想显式设置默认值和 ,* 部分,因为它引发了错误。然后运行查询。也不行。
  • 当没有为该列分配默认值时,您将得到一个 NULL 值,这就是我在末尾添加 0 的原因。
  • 啊,我明白了。不过,就我而言,分配了一个默认值。由于某种原因,它没有被查询返回。
  • 你能告诉我存储在字段 COLUMN_DEFAULT 中的值是多少吗?
  • 当然可以。 ((0)).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多