3 回答

TA貢獻1840條經(jīng)驗 獲得超5個贊
一種不太復雜的方法(在某些情況下可能已足夠):在原始SELECT之后和FROM子句之前添加原始SP,然后在tmpTable中添加INSERT INTO以將SP結果保存到tmpTable中。
運行修改后的SP,最好使用有意義的參數(shù)以獲取實際數(shù)據(jù)。恢復該過程的原始代碼。
現(xiàn)在,您可以從SQL Server Management Studio獲取tmpTable的腳本,或查詢sys.columns以獲取字段描述。

TA貢獻1804條經(jīng)驗 獲得超3個贊
這是我寫的一些代碼。想法是(如其他人所述)是獲取SP代碼,對其進行修改并執(zhí)行。但是,我的代碼不會更改原始SP。
第一步,獲取SP的定義,去除“創(chuàng)建”部分,并在參數(shù)聲明(如果存在)之后去除“ AS”。
Declare @SPName varchar(250)
Set nocount on
Declare @SQL Varchar(max), @SQLReverse Varchar(MAX), @StartPos int, @LastParameterName varchar(250) = '', @TableName varchar(36) = 'A' + REPLACE(CONVERT(varchar(36), NewID()), '-', '')
Select * INTO #Temp from INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME = 'ADMIN_Sync_CompareDataForSync'
if @@ROWCOUNT > 0
BEGIN
Select @SQL = REPLACE(ROUTINE_DEFINITION, 'CREATE PROCEDURE [' + ROUTINE_SCHEMA + '].[' + ROUTINE_NAME + ']', 'Declare')
from INFORMATION_SCHEMA.ROUTINES
where ROUTINE_NAME = @SPName
Select @LastParameterName = PARAMETER_NAME + ' ' + DATA_TYPE +
CASE WHEN CHARACTER_MAXIMUM_LENGTH is not null THEN '(' +
CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN 'MAX' ELSE CONVERT(varchar,CHARACTER_MAXIMUM_LENGTH) END + ')' ELSE '' END
from #Temp
WHERE ORDINAL_POSITION =
(Select MAX(ORDINAL_POSITION)
From #Temp)
Select @StartPos = CHARINDEX(@LastParameterName, REPLACE(@SQL, ' ', ' '), 1) + LEN(@LastParameterName)
END
else
Select @SQL = REPLACE(ROUTINE_DEFINITION, 'CREATE PROCEDURE [' + ROUTINE_SCHEMA + '].[' + ROUTINE_NAME + ']', '') from INFORMATION_SCHEMA.ROUTINES where ROUTINE_NAME = @SPName
DROP TABLE #Temp
Select @StartPos = CHARINDEX('AS', UPPER(@SQL), @StartPos)
Select @SQL = STUFF(@SQL, @StartPos, 2, '')
(請注意,基于唯一標識符創(chuàng)建了新的表名)現(xiàn)在,假設這是執(zhí)行返回結果集的select的代碼,請在代碼中找到最后一個“ From”字。
Select @SQLReverse = REVERSE(@SQL)
Select @StartPos = CHARINDEX('MORF', UPPER(@SQLReverse), 1)
更改代碼以將結果集選擇到表中(該表基于uniqueidentifier)
Select @StartPos = LEN(@SQL) - @StartPos - 2
Select @SQL = STUFF(@SQL, @StartPos, 5, ' INTO ' + @TableName + ' FROM ')
EXEC (@SQL)
結果集現(xiàn)在在表中,表是否為空都沒有關系!
讓我們獲取表的結構
Select * from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName
您現(xiàn)在可以用這個來做魔術了
別忘了刪除該唯一表
Select @SQL = 'drop table ' + @TableName
Exec (@SQL)
希望這可以幫助!
- 3 回答
- 0 關注
- 644 瀏覽
添加回答
舉報