(1)是否有一种好的/可靠的方式来查询系统目录 找到所有在其中创建一些临时表的存储过程 源代码主体,但不会将它们放在身体末端?
(2)通常,可以在SP中创建临时表而不删除
他们在同一个SP导致一些问题,如果是这样,有什么问题?
我在这个问题的背景下问这个问题 主要是SQL Server 2008 R2和SQL Server 2012。
非常感谢提前。
答案 0 :(得分:2)
1)可能没有好的/可靠的方式 - 尽管你可以使用一些你可以在其他地方找到的神秘方式来提取sp的文本。
2)一般情况下 - 这不会导致任何问题 - 临时表(#tables)受范围限制,并且当其范围消失时将被标记为删除。
和表变量同样
一个例外是全局临时表(## tables),当没有作用域保存对它们的引用时,这些表被清除。避免那些人 - 通常(几乎总是阅读)比使用全局临时表更好的方法。
叹息 - 如果你想沿着(1)路走下去,那么请注意在查看sql server里面的代码时会有很多陷阱 - 许多辅助函数和信息表会将实际代码截断为一个NVARCHAR(4000)
如果你看一下sp_helptext的代码,你会看到一个非常可怕的游标,它会拉动实际文本。
我写了一个 long 时间以前在代码中查找字符串 - 你可以在你的数据库上运行它 - 寻找'CREATE TABLE#'和'DROP TABLE#'并比较输出....
DECLARE @SearchString VARCHAR(255) = 'DELETE FROM'
SELECT
[ObjectName]
, [ObjectText]
FROM
(
SELECT
so.[name] AS [ObjectName]
, REPLACE(comments.[c], '#x0D;', '') AS [ObjectText]
FROM
sys.objects AS so
CROSS APPLY (
SELECT CAST([text] AS NVARCHAR(MAX))
FROM syscomments AS sc
WHERE sc.[id] = so.[object_id]
FOR XML PATH('')
)
AS comments ([c])
WHERE
so.[is_ms_shipped] = 0
AND so.[type] = 'P'
)
AS spText
WHERE
spText.[ObjectText] LIKE '%' + @SearchString + '%'
或者更好 - 在您的代码库中使用您喜欢的任何选择工具 - 您已经将所有的sp等编写到某个源代码管理器中,对吧.....?
答案 1 :(得分:2)
不是100%确定这是否准确,因为我没有一套好的测试数据可供使用。首先,您需要一个函数来计算字符串的出现次数(从here无耻地被盗):
CREATE FUNCTION dbo.CountOccurancesOfString
(
@searchString nvarchar(max),
@searchTerm nvarchar(max)
)
RETURNS INT
AS
BEGIN
return (LEN(@searchString)-LEN(REPLACE(@searchString,@searchTerm,'')))/LEN(@searchTerm)
END
接下来使用这样的功能。它会在程序文本中搜索字符串,并在创建的数量与丢弃数量不匹配时进行报告:
WITH CreatesAndDrops AS (
SELECT procedures.name,
dbo.CountOccurancesOfString(UPPER(syscomments.text), 'CREATE TABLE #') AS Creates,
dbo.CountOccurancesOfString(UPPER(syscomments.text), 'DROP TABLE #') AS Drops
FROM sys.procedures
JOIN sys.syscomments
ON procedures.object_id = syscomments.id
)
SELECT * FROM CreatesAndDrops
WHERE Creates <> Drops
答案 2 :(得分:1)
我认为来自红门的 SQL搜索工具在这种情况下会派上用场。您可以从here下载。该工具将在存储过程,函数,视图等中找到sql文本...
只需安装此插件,您就可以从 SSMS 轻松找到sql文本。