SQL Server - 查找不删除临时表的SP

时间:2014-09-18 12:15:37

标签: sql sql-server

(1)是否有一种好的/可靠的方式来查询系统目录 找到所有在其中创建一些临时表的存储过程 源代码主体,但不会将它们放在身体末端

(2)通常,可以在SP中创建临时表而不删除
他们在同一个SP导致一些问题,如果是这样,有什么问题?

我在这个问题的背景下问这个问题 主要是SQL Server 2008 R2和SQL Server 2012。

非常感谢提前。

3 个答案:

答案 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文本。