Как написать динамический SQL для этого? - PullRequest
2 голосов
/ 27 мая 2011

Мне нужно написать процедуру, в которой будут только операторы execute.

Пример:

Create Procedure dbo.allSPExecute( @id int)
as
begin

EXEC dbo.tic @day= 7,@name = 'Gname',@Type = 'Utype'
EXEC dbo.tic @day= 7,@name = 'tname',@Type = 'Utype'
EXEC dbo.gtype @day = 7,@Tname = 'UName_By',@Udept = 'Dept'

End

У меня более 50 таких операторов. У меня есть таблица, которая имеет вид Lookup:

ID  Name        SCol      Dcol       IOrd
1   dbo.tic     Gname     @name       1
1   dbo.tic     tname     @name       2
1   dbo.tic     Utype     @Type       1
1   dbo.tic     Utype     @Type       2
2   dbo.gtype   UName_By  @Tname      1
2   dbo.gtype   Dept      @Udept      1

Есть ли способ, чтобы, если я передам ID, он возьмет значения из таблицы поиска и выполнит процедуру.Кто-нибудь может помочь?

РЕДАКТИРОВАТЬ: Изменены данные из таблицы поиска и процедура создания

Ответы [ 3 ]

4 голосов
/ 28 мая 2011

Самое простое решение - сделайте свой сохраненный процесс следующим образом:

Create Procedure dbo.allSPExecute( @id int)
as

DECLARE @SQL varchar(max)

SET @SQL = 'USE MyDB'

SELECT @SQL = @SQL +
'EXEC ' + t.Name + ' @day = 7,' + t.Dcol + ' = ''' + t.Scol + ''
FROM MyTable t
WHERE t.id = @ID

EXEC (@SQL)
1 голос
/ 28 мая 2011

вот решение, которое не требует курсоров.Я использую ключевое слово FOR XML для объединения строк вместе.Я делаю это в двух местах - один раз для конкатенации списка параметров и один раз для конкатенации всех отдельных операторов exec.Я не проверял это, хотя, но я думаю, что это должно быть намного быстрее, чем использование курсоров

CREATE PROCEDURE dbo.allSPExecute( @id INT ) 
AS  
BEGIN   
  DECLARE @query VARCHAR(MAX);   
  SELECT @query =   (
    SELECT ExecPart + ' ' + SUBSTRING(Params,2,LEN(Params)) + CHAR(10)
    FROM
    (
      SELECT 
        ExecPart ='EXEC ' +(SELECT TOP 1 Name FROM MyTable WHERE ID = @id) ,
        Params = (SELECT ', ' + Dcol + ' = ' + Scol 
                  FROM MyTable t1 WHERE ID = @id AND t1.IOrd = t.IOrd FOR XML PATH(''))
      FROM MyTable t
      WHERE ID = @id
      GROUP BY IOrd
    ) t
    FOR XML PATH('')   
  ) 

  EXEC (@query) 
END
0 голосов
/ 28 мая 2011

Вот пример курсора, написанный с нуля и непроверенный:

declare @dynsql as nvarchar(300)
declare @tname as nvarchar(100)
declare @tscol as nvarchar(100)
declare @tdcol as nvarchar(100)

set @dynsql = ''

declare ticker as cursor for select Name, SCol, DCol from Lookup
open ticker
fetch next from ticker into @tname, @tscol, @tdcol

while @@FETCH_STATUS = 0
BEGIN

set @dynsql = 'EXEC ' + @tname + ' @day=7, ' + @tdcol + '=''' + @tscol + ''''

exec(@dynsql)

FETCH NEXT from ticker into @tname, @tscol, @tdcol
END

close ticker
deallocate ticker
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...