禁用 SQL2008 结果集中的消息

Posted

技术标签:

【中文标题】禁用 SQL2008 结果集中的消息【英文标题】:Disable messages in SQL2008 result set 【发布时间】:2010-10-05 22:25:30 【问题描述】:

关于thesetwo 的问题,有没有办法禁用可能与SQL2008 中的结果集一起发送的消息?

(请注意,这与 ANSI_WARNINGS 设置无关。或 NOCOUNT。)

感谢您的帮助。

编辑:兼容性设置或表所有者没有问题。 这与 NOCOUNT 无关。相信我。

【问题讨论】:

这些会是类似弃用功能警告的消息吗?我还没有找到禁用这些的方法。 我想是的。一个是关于截断数据的警告,另一个是全文搜索包含干扰词。 您在 IDE 中运行 SProc 时看到了哪些消息? 看看你上面的评论! 我希望您能告诉我在您的 IDE 中运行时的确切消息,届时可能会有所帮助。 【参考方案1】:

不,没有办法禁用与结果集一起发送的所有消息。设置 nocount on/off 对这些类型的消息没有影响。

【讨论】:

【参考方案2】:

无论如何,您都需要在 Sproc 的主体中使用 NOCOUNT(感谢您在有无的情况下对其进行了测试)

在这种情况下,我得到了对 Sproc 的实际调用(从我的 APP 中的 Debug 或使用 SQL Profiler),然后将其插入 SSMS 或您使用的任何 IDE,将其包装在 ROLLBACK 事务中(所以它不能意外地做出任何改变)。注意:使用您的 IDE 登录到 SQL Server,使用与应用程序将使用的凭据相同的凭据。

BEGIN TRANSACTION
EXEC StaffEnquirySurnameSearch @searchterm = 'FOOBAR'
ROLLBACK

看看你会得到什么。使用 TEXT 模式进行输出,而不是可能隐藏某些内容的 GRID 模式

只是为了说明我认为应该如何将 NOCOUNT 添加到您的 SProc 中:

CREATE PROCEDURE StaffEnquirySurnameSearch
    @searchterm varchar(255)
AS

SET NOCOUNT ON

SELECT  AD.Name, AD.Company, AD.telephoneNumber, AD.manager, CVS.Position,
    CVS.CompanyArea, CVS.Location, CVS.Title, AD.guid AS guid,
    AD.firstname, AD.surname
FROM ADCVS AD
LEFT OUTER JOIN CVS ON
    AD.Guid=CVS.Guid 
WHERE AD.SurName LIKE @searchterm
ORDER BY AD.Surname, AD.Firstname
GO

我注意到您没有在表前加上数据库所有者(最常见的是“dbo”),这可能意味着任何人都拥有额外的副本,并且从应用程序权限的角度来看它们是默认的,尽管我认为这不会改变 [SQL 版本之间] 的结果集,但是,同样的事情适用于 Sproc 的所有权,您可能会调用一些较早的版本,为不同的所有者创建。

在您的 ASP.NET 代码中定义 Sproc 名称的地方(我似乎在您的链接问题中找不到)也应该定义所有者,即

EXEC dbo.StaffEnquirySurnameSearch @searchterm = 'FOOBAR'

【讨论】:

【参考方案3】:

您从 SQL 2000 升级到 2008 时是否更改了兼容性级别?如果是某种向后兼容性警告消息可能会治愈它。

【讨论】:

【参考方案4】:

您是否尝试过不使用“OR”运行相同的 CONTAINS 查询?

即:

SELECT * FROM my_table
WHERE CONTAINS(my_column, 'a monkey')  -- "a" is a noise word

而不是

SELECT * FROM my_table
WHERE CONTAINS(my_column, 'a OR monkey')  -- "a" is a noise word

【讨论】:

【参考方案5】:

您可以将其包装在 try catch...更多信息在线书籍中

例如:

创建表 Test_ShortString(

ShortString varchar(10) NULL

)

开始尝试

insert into 
Test_ShortString (ShortString) 
values ('123456789012345')

结束尝试

开始抓

--Select Error_Number() as ErrorNumber

结束捕获

【讨论】:

以上是关于禁用 SQL2008 结果集中的消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个结果集中列出 SQL Server 中所有数据库中的所有表?

Sql_从查询的结果集中分组后取最后有效的数据成新的结果集小记(待优化)

sql 将单元ID和“硬编码”数据选择到查询结果集中,该结果集可以粘贴到sql开发人员中,用于缺少特定单元的单元

从 Oracle 中的动态 SQL 获取结果集中的结果

JDBC结果集

将两个数据库列连接到一个结果集列