Gon*_*alo 5 sql t-sql sql-server sql-server-2000
通过以下脚本,我得到了数据库中的所有存储过程:
SELECT sm.id, OBJECT_NAME(sm.id) AS object_name, sm.text
FROM syscomments AS sm
JOIN sysobjects AS so ON sm.id = so.id
WHERE (so.status >= 0) AND (so.xtype = 'P')
Run Code Online (Sandbox Code Playgroud)
我希望每个存储过程获得一行.表syscomments中的文本字段是nvarchar 4000.因此,方法可以存储在多个寄存器中.问题是我存储了超过15000个字符的过程.
SELECT sm.id, COUNT(sm.colid) AS Cantidad
INTO #SPrepeated
FROM syscomments AS sm INNER JOIN
sysobjects AS so ON sm.id = so.id
WHERE (so.status >= 0) AND (so.xtype = 'P') AND (so.category = 0)
GROUP BY sm.id, so.name
HAVING (COUNT(sm.colid) > 1)
SELECT sm.id, OBJECT_NAME(sm.id) AS object_name, sm.text
into #Tresult
FROM syscomments AS sm
JOIN sysobjects AS so ON sm.id = so.id
JOIN #SPrepeated as spr ON so.id = spr.id
WHERE (so.status >= 0) AND (so.xtype = 'P')
select * from #Tresult
drop table #Tresult
drop table #SPrepeated
Run Code Online (Sandbox Code Playgroud)
在#TResult中,我拥有表中有多个记录的所有存储过程syscomments.考虑到结果可能超过8000个字符,如何将这些分组并连接成每个过程的单个记录?
我按照 @devio 的建议从应用程序中调用了 SELECT 语句,并且它运行得很好(文本字段没有被截断)。@LittleBobbyTables 建议的脚本是问题的解决方案,只需稍作修改,因为第一条记录连接了两次相同的字符串。
-- Gonzalo's original code --
SELECT sm.id, COUNT(sm.colid) AS Cantidad
INTO #SPrepeated
FROM syscomments AS sm INNER JOIN
sysobjects AS so ON sm.id = so.id
WHERE (so.status >= 0) AND (so.xtype = 'P') AND (so.category = 0)
GROUP BY sm.id, so.name
HAVING (COUNT(sm.colid) > 1)
SELECT sm.id, sm.colid, OBJECT_NAME(sm.id) AS object_name,
cast(sm.text as ntext) as [text]
into #Tresult
FROM syscomments AS sm
JOIN sysobjects AS so ON sm.id = so.id
JOIN #SPrepeated as spr ON so.id = spr.id
WHERE (so.status >= 0) AND (so.xtype = 'P')
-- LittleBobbyTables code
-- Create our #TresultSingle temporary table structure --
SELECT TOP 1 [id], object_name, cast([text] as ntext) as [text]
INTO #TresultSingle
FROM #Tresult
-- Clear out the table, ready to insert --
TRUNCATE TABLE #TresultSingle
DECLARE @id int, @previd int, @colid int, @objectname nvarchar(4000),
@text nvarchar(4000)
DECLARE @ptrval varbinary(16), @offset int
SET @text = ''
set @previd = 0;
-- Begin cursor, and start praying --
DECLARE ResultCursor CURSOR
FOR
SELECT [id], colid, [object_name], [text]
FROM #Tresult
ORDER BY [id], colid
OPEN ResultCursor
FETCH NEXT FROM ResultCursor
INTO @id, @colid, @objectname, @text
WHILE @@FETCH_STATUS = 0
BEGIN
-- If the ID has changed, create a new record in #TresultSingle --
IF @id <> @previd
BEGIN
INSERT INTO #TresultSingle
SELECT @id, @objectname, @text
END
ELSE
BEGIN
-- Get the textpointer of the current @id --
SELECT @ptrval = TEXTPTR(text)
FROM #TresultSingle
WHERE [id] = @id
-- Set our offset for inserting text --
SET @offset = 4000 * (@colid - 1)
-- Add the new text to the end of the existing text --
UPDATETEXT #TresultSingle.text @ptrval @offset 0 @text
END
SET @previd = @id
FETCH NEXT FROM ResultCursor
INTO @id, @colid, @objectname, @text
END
CLOSE ResultCursor
DEALLOCATE ResultCursor
SELECT * FROM #TresultSingle
DROP TABLE #TresultSingle
drop table #Tresult
drop table #SPrepeated
Run Code Online (Sandbox Code Playgroud)