Построить оператор Select во время выполнения и выполнить, используя sp_MSforeachtable - PullRequest
0 голосов
/ 05 июля 2011

У меня есть таблица ниже:

ID  TableName   FieldName
1   tbl1    fieldA
1   tbl1    fieldB
2   tbl2    fieldC
2   tbl2    fieldD

ddl как под

Declare @tblPlaceholder table(ID int,TableName Nvarchar(20),FieldName Nvarchar(20))
insert into @tblPlaceholder 
    select 1,'tbl1','fieldA' union all select 1,'tbl1','fieldB' union all
    select 2,'tbl2','fieldC' union all select 2,'tbl2','fieldD'
select * from @tblPlaceholder

Что мне нужно сделать, так это то, что во время выполнения мне нужно создавать запросы с полями и именами таблиц и впредь мне нужно их выполнять.

Итак, во время выполнения должны быть сформированы запросы

ID  Query
1    Select tbl1.fieldA,tbl1.fieldB from tbl1
2    Select tbl2.fieldC,tbl2.fieldD from tbl2

Мой запрос как под и отлично работает

-- Step 1: Build the query and insert the same into a table variable
Insert into @t 
Select ID, Query = ' Select ' + FieldNames + ' from ' + TableName
From
(
Select ID,TableName, FieldNames = Stuff((select ',' + CAST(TableName as Nvarchar(20)) + '.' + CAST(FieldName as Nvarchar(20)) 
            from @tblPlaceholder t2 where t2.ID = t1.ID
            FOR XML PATH('')),1,1,'')
From @tblPlaceholder t1
Group By t1.ID,t1.TableName)X

/* output of step 1
select * from @t

ID  Query
1    Select tbl1.fieldA,tbl1.fieldB from tbl1
2    Select tbl2.fieldC,tbl2.fieldD from tbl2
*/


-- Step 2 : loop thru the ID and execute the queries
While (@i <= 2) -- since there are two id's.. this can even be configurable as max(id)
Begin
      SELECT @QueryList = (Select Query from @t where ID = @i)
      exec(@QueryList)    
      set @i  += 1
End

Но я почти уверен, что это можно сделать даже лучше. Я искал sp_MSforeachtable , но я не уверен, сможем ли мы это сделать?

Не могли бы вы, люди, помогите мне.

1 Ответ

0 голосов
/ 05 июля 2011

Я сделал пример. Отрегулируйте его в соответствии с вашими потребностями.

DECLARE @mytable AS VARCHAR(100)
DECLARE @sql AS VARCHAR(1000)

        DECLARE mycursor CURSOR FOR
        SELECT name
        FROM sys.tables
        -- WHERE your conditions here!

        OPEN mycursor 
        FETCH NEXT FROM mycursor INTO @mytable

        WHILE @@FETCH_STATUS = 0

        BEGIN

        SET @sql = 'SELECT * FROM ' + @tablename -- Define the query string. replace with your code
        EXEC(@sql) -- execure the query
        FETCH NEXT FROM mycursor INTO @mytable

        END

        CLOSE mycursor
        DEALLOCATE mycursor
...