使用局部变量在sys.procedures中搜索过程名称(SQL)

时间:2017-06-28 20:32:46

标签: sql sql-server object procedure local-variables

我想在给定服务器中的几个数据库上运行一系列查询(实际上是相同的查询),我只更改要查找的表名。

USE database 
Go

SELECT name
FROM   sys.procedures
WHERE  Object_definition(object_id) LIKE '%value%'

大约有5台服务器,平均有10个数据库可供搜索。我不想每次都复制并通过字符串。我想声明一个@string并更新一次。

DECLARE @string_lookup NVARCHAR(MAX) = '%stringtolookup%'

我已经尝试过两种方式而且无法让它发挥作用。这就是我尝试过的:

选项1:

DECLARE @string_lookup NVARCHAR(MAX) = '%stringtolookup%'

Exec ('SELECT name FROM sys.procedures WHERE Object_definition(object_id) LIKE ' + @string_lookup)

选项2:

DECLARE @var VARCHAR(100) ,@SQL NVARCHAR(max) = ''

SET @var = '%stringtolookup%'
SET @sql = 'select name From sys.procedures WHERE  Object_definition(object_id) LIKE ' + @var

EXEC SP_EXECUTESQL @SQL

似乎都没有用。我发现了一些关于如何声明@variable的门票,并使用USE声明的一部分来更改数据库名称,但我不需要我需要的是修改过程名称和搜索它在每个数据库中没有一系列输出。

我收到以下错误消息:

Msg 137, Level 15, State 2, Line 3
Must declare the scalar variable "@string_lookup".

下面提供了一条评论,建议我打印数据,因为我缺少单引号,谢谢你确实修复了错误的一部分,但这是现在的代码,它仍然无法正常工作:

DECLARE @string_lookup VARCHAR(100) = '%web_app%'
DECLARE @SQL NVARCHAR(max) = ''
SET @sql = 'select name From sys.procedures WHERE  Object_definition(object_id) LIKE ''' + @var + ''''

USE db1
Go
    EXEC SP_EXECUTESQL @SQL

USE db2
Go
    EXEC SP_EXECUTESQL @SQL

USE db3
Go
    EXEC SP_EXECUTESQL @SQL

3 个答案:

答案 0 :(得分:2)

利用sys.databases,你可以在这里使用动态sql来避免可怕的循环。代码中还有其他注释,以帮助提供上下文理解。

DECLARE @string_lookup VARCHAR(100) = '%web_app%'
DECLARE @SQL NVARCHAR(max) = ''

select @SQL = @SQL + 'select ''' + quotename(db.name) + ''' as DatabaseName, name COLLATE SQL_Latin1_General_CP1_CI_AS from ' + quotename(db.name) + '.sys.procedures where Object_definition(object_id) LIKE ''' + @string_lookup + ''' UNION ALL '
from sys.databases db
where db.state_desc = 'ONLINE' --exclude OFFLINE databases
--you could include any other predicates here to eliminate any other databases


select @SQL = left(@SQL, LEN(@SQL) - 10)

select @SQL --uncomment the next line when you are comfortable the dynamic sql is correct
--exec sp_executesql @SQL

答案 1 :(得分:1)

如果先打印出SQL,则可以看到错误的位置。 你缺少字符串周围的单引号。

NAMESPACE/PROJECT_NAME

答案 2 :(得分:0)

变量可以在它们声明的行上设置,并且你不需要动态SQL。

declare @var varchar(100) = '%stringtolookup%'

select name
From sys.procedures 
WHERE  object_definition(object_id) LIKE @var