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

Using local variables to search for procedure names in sys.procedures (SQL)

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

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

变量可以在声明的那一行设置,你不需要动态 SQL。

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

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

如果你先把你的SQL打印出来,你就能看出错误在哪里。 您在字符串周围缺少单引号。

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

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

EXEC SP_EXECUTESQL @SQL

利用 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