sql >> データベース >  >> RDS >> Sqlserver

SPパラメータにT-SQLのデフォルト値があるかどうかを確認する

    パラメータ名に「AS」記号が含まれている場合-my

    を試してはいけません
    create procedure ViewParameters
        @procedure varchar(50)
    as
        declare
            @w varchar(max),
            @p int, @p2 int,
            @t varchar(max)
    
    
        /* Andrey Rubanko 18 jul 2013 */
    
        /* fill temporary table with procedure body */
    
        select @w = definition
        from sys.sql_modules
        where object_id = object_id(@procedure)
    
        declare @lines table (line varchar(500), id int identity(1, 1))
    
        while len(@w) > 0 begin
            set @p = charindex(char(10), @w)
            if @p > 0 begin
                insert @lines(line) values(replace(replace(SUBSTRING(@w, 1, @p - 1), char(13), ''), char(9), ' '))
                set @w = SUBSTRING(@w, @p + 1, 10000)
            end else begin
                insert @lines(line) values(replace(@w, char(13), ''))
                set @w = ''
            end
        end
    
    
    
        /* remove comments */
    
        declare 
            @i int,
            @inCommentNow bit,
            @again bit
    
        set @i = 1
        set @inCommentNow = 0
    
        while @i <= (select max(id) from @lines) begin
            select @w = line from @lines where id = @i
            set @again = 0
    
            if @inCommentNow = 0 begin
                set @p = patindex('%--%', @w)
                if @p > 0 begin
                    set @w = SUBSTRING(@w, 1, @p - 1)
    
                    update @lines
                    set line = @w
                    where id = @i
    
                end
    
                set @p = patIndex('%/*%', @w)
                if @p > 0 begin
                    set @p2 = PATINDEX('%*/%', @w) 
                    if @p2 > 0 begin
                        update @lines
                        set line = substring(@w, 1, @p - 1) + SUBSTRING(@w, @p2 + 2, 10000)
                        where id = @i
    
                        set @again = 1
                    end else begin
                        set @inCommentNow = 1
    
                        update @lines
                        set line = SUBSTRING(@w, 1, @p - 1)
                        where id = @i
                    end
                end
            end
    
            if @inCommentNow = 1 begin
                set @p = PATINDEX('%*/%', @w)
                if @p > 0 begin
                    update @lines
                    set line = SUBSTRING(@w, @p + 2, 10000)
                    where id = @i
    
                    set @inCommentNow = 0
                    set @again = 1
                end else 
                    update @lines
                    set line = ''
                    where id = @i
            end
    
            if @again = 0
                set @i = @i + 1
        end
    
    
        /* remove all except parameters */
        declare
            @first int,
            @last int
    
        set @i = 1
    
        while @last is null begin
            select @w = line from @lines where id = @i
    
            if SUBSTRING(@w, 1, 2) = 'as'
                set @last = @i - 1
    
            set @p = PATINDEX('% as%', @w) 
            if @last is null and @p > 0  begin
                set @w = SUBSTRING(@w, 1, @p - 1)
    
                update @lines
                set line = @w
                where id = @i
    
                if charindex('@', @w) > 0
                    set @last = @i
                else 
                    set @last = @i - 1
            end
    
    
            set @p = CHARINDEX('@', @w)
            if @first is null and @p > 0 begin
                set @first = @i
                set @w = SUBSTRING(@w, @p, 10000)
            end
    
            set @i = @i + 1
        end
    
        delete @lines
        where @first is null 
            or id < @first
            or id > @last
    
    
    
        /* decode lines to paramters */
    
        declare @par table (ParameterName varchar(50), ParameterType varchar(50), DefaultValue varchar(50))
    
        declare
            @name varchar(50),
            @type varchar(50),
            @default varchar(50)
    
        declare c cursor for
            select line
            from @lines
        open c
        fetch next from c into @w 
        while @@FETCH_STATUS = 0 begin
            while len(@w) > 0 begin
                set @default = null
    
                set @w = SUBSTRING(@w, charindex('@', @w) + 1, 10000)
                set @p = CHARINDEX(',', @w)
                print 'start:' + @w
                if @p > 0 begin
                    set @t = SUBSTRING(@w, 1, @p - 1)
                    set @w = LTrim(RTrim(SUBSTRING(@w, @p + 1, 10000)))
                end else begin
                    set @p = patindex('% as%', @w)
                    if @p > 0 
                        set @t = SUBSTRING(@w, 1, @p - 1)
                    else 
                        set @t = @w
                    set @w = ''
                end
    
                print 'T=' + @t
                set @p = charindex(' ', @t) 
                if @p = 0
                    print 'NameError:' + @t + ' ->' + cast(@p as varchar)
                set @name = SUBSTRING(@t, 1, @p - 1)
                set @t = SUBSTRING(@t, @p + 1, 10000)
    
                set @p = CHARINDEX('=', @t)
                if @p > 0 begin
                    set @default = Replace(LTrim(RTrim(SUBSTRING(@t, @p + 1, 10000))), '''', '')
                    set @t = SUBSTRING(@t, 1, @p - 1)
                end 
    
                set @p = CHARINDEX('(', @t)
                if @p > 0 
                    set @type = LTrim(RTrim(SUBSTRING(@t, 1, @p - 1)))
                else
                    set @type = LTrim(RTrim(@t))
    
                insert @par (ParameterName, ParameterType, DefaultValue)
                values(@name, @type, @default)
            end--while len(@w) > 0
    
            fetch next from c into @w 
        end
        close c
        deallocate c
    
        select *
        from @par
    


    1. MariaDBのINSTR()とLOCATE()の違い

    2. SQLServerの動的ピボットテーブル

    3. 複数のテーブルの総数で注文することはできますか?

    4. pg_dumpシリアルデータ型の問題