首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用局部变量在sys.procedures (SQL)中搜索过程名称

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

Stack Overflow用户
提问于 2017-06-28 20:32:45
回答 3查看 451关注 0票数 0

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

代码语言:javascript
复制
USE database 
Go

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

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

代码语言:javascript
复制
DECLARE @string_lookup NVARCHAR(MAX) = '%stringtolookup%'

我试过两种方法,但我无法让它起作用。这就是我尝试过的:

备选案文1:

代码语言:javascript
复制
DECLARE @string_lookup NVARCHAR(MAX) = '%stringtolookup%'

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

备选案文2:

代码语言:javascript
复制
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

两者似乎都不起作用。我发现了一些关于如何声明@变量,并使用它作为use语句的一部分来更改数据库名称的票证,但我不需要修改一个过程名,并在每个数据库中搜索它,而不需要一系列输出。

我收到以下错误消息:

代码语言:javascript
复制
Msg 137, Level 15, State 2, Line 3
Must declare the scalar variable "@string_lookup".

下面提供了一条注释,建议我打印数据,因为我缺少单引号,谢谢您修复了错误的一部分,但是这是现在的代码,它仍然不能工作:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-28 21:02:34

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

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2017-06-28 20:39:30

如果首先打印出SQL,则可以看到错误所在。您缺少字符串周围的单引号。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-06-28 20:39:04

可以在声明变量的行上设置变量,因此不需要动态SQL。

代码语言:javascript
复制
declare @var varchar(100) = '%stringtolookup%'

select name
From sys.procedures 
WHERE  object_definition(object_id) LIKE @var
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44812046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档