第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢索存儲過程結果集的列定義

檢索存儲過程結果集的列定義

慕妹3242003 2019-10-29 12:57:20
我正在使用SQL Server 2008中的存儲過程,并且已經(jīng)了解到INSERT INTO必須使用已預定義的臨時表才能使用數(shù)據(jù)。很好,除非我不是寫存儲過程的人(除了列出存儲過程的定義和閱讀代碼),否則我如何弄清楚如何定義臨時表?例如,EXEC sp_stored_procedure的臨時表是什么樣的?那是一個簡單的存儲過程,我可能會猜到數(shù)據(jù)類型,但是似乎必須有一種方法可以讀取從執(zhí)行該過程返回的列的類型和長度。
查看完整描述

3 回答

?
慕斯709654

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以獲取字段描述。


查看完整回答
反對 回復 2019-10-29
?
狐的傳說

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)

希望這可以幫助!


查看完整回答
反對 回復 2019-10-29
  • 3 回答
  • 0 關注
  • 644 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號