找出用于给定存储过程的设置

mar*_*c_s 5 sql-server-2008 sql-server stored-procedures

作为我上一个问题后续

是有办法需要找出什么ANSI_NULLSANSI_PADDING等设置里,当一个给定的过程中我创建了数据库?

似乎我的客户有几个存储过程和一些已“调整”的触发器 - 但不幸的是,使用了这些数据库设置的“错误”集。我可以找出哪些procs 和触发器受到影响,还是需要使用正确的设置重新创建所有这些?

Aar*_*and 9

这可以通过以下方式确定sys.sql_modules

USE tempdb;
GO
SET ANSI_NULLS ON;
GO
CREATE PROCEDURE dbo.foo1 AS SELECT 1;
GO
SET ANSI_NULLS OFF;
GO
CREATE PROCEDURE dbo.foo2 AS SELECT 1;
GO

SELECT name = OBJECT_NAME([object_id]), uses_ansi_nulls
  FROM sys.sql_modules
  WHERE OBJECT_NAME([object_id]) IN (N'foo1', N'foo2');

GO
DROP PROCEDURE dbo.foo1, dbo.foo2;
Run Code Online (Sandbox Code Playgroud)

结果:

name   uses_ansi_nulls
----   ---------------
foo1   1
foo2   0
Run Code Online (Sandbox Code Playgroud)

其他一些有用的列:

object_id
definition
uses_ansi_nulls
uses_quoted_identifier
is_schema_bound
uses_database_collation
is_recompiled
null_on_null_input
execute_as_principal_id
Run Code Online (Sandbox Code Playgroud)

请注意,某些设置(例如arithabortansi_warningsansi_padding)不与对象一起存储。此外,您还需要使用正确设置重新编译程序,以针对已识别为“错误”的任何程序进行设置。

  • [存储过程使用执行时指定的 SET 设置执行,SET ANSI_NULLS 和 SET QUOTED_IDENTIFIER 除外。指定 SET ANSI_NULLS 或 SET QUOTED_IDENTIFIER 的存储过程使用在存储过程创建时指定的设置。](http://msdn.microsoft.com/en-us/library/ms190356.aspx) (5认同)
  • 嗯,不知道你可以在一个语句中删除多个这样的过程。好的! (2认同)