Использование имени переменной для запуска запроса к нескольким таблицам - PullRequest
1 голос
/ 13 марта 2012

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

Как вы можете видеть ниже @tablename - это имя таблицы, для которой я хочу выполнить запросы, но как мне выполнить эти запросы, используя @tablename в качестве имени таблицы?

CREATE TABLE [BusinessListings].[dbo].[temptablenames]
(id int,
name nvarchar(50),
)

INSERT INTO [BusinessListings].[dbo].[temptablenames] (id, name)
VALUES 
(1,'MongoOrganisationsACT1'),
(2,'MongoOrganisationsNSW1'),
(3,'MongoOrganisationsNT1'),
(4,'MongoOrganisationsQLD1'),
(5,'MongoOrganisationsSA1'),
(6,'MongoOrganisationsTAS1'),
(7,'MongoOrganisationsVIC1'),
(8,'MongoOrganisationsWA1');

DECLARE @tablename sysname,
@id int
SET @id = 1
WHILE (@id < 9)
BEGIN
select @tablename = name from temptablenames where id = @id

select @tablename


        select _key_out, sum(quality_score) as sumscore, count(*) as reccount, (sum(quality_score) / count(*)) as ave
        into tempga0
        from @tablename
        group by _key_out

        select _key_out, count(*) as reccount
        into tempga3
        from @tablename
        where dedupe_result is null
        group by _key_out
        having count(*)>1

        select a._key_out, max(quality_score) as maxdedupetotalscore
        into tempga4
        from
        @tablename a
        join
        tempga3 b
        on a._key_out = B._key_out
        --where isdeleted is null
        group by a._key_out

        --- keep records
        update @tablename
        set dedupe_result = 'Keep'
        from 
        @tablename a
        join
        tempga4 b
        on a._key_out = B._key_out  
        where a.quality_score = b.maxdedupetotalscore
        --and isdeleted is null
        and dedupe_result is null

SET @id = @id + 1 
END
GO

DROP TABLE [BusinessListings].[dbo].[temptablenames]

примечание: это только часть запросов, которые я хочу выполнить, я просто хочу выяснить, как заменить переменную в запросе именем таблицы. Кроме того, я знаю, что это нехорошая форма, но есть причина, по которой мне нужно делать это таким образом.

обновленный рабочий код здесь:

DECLARE @tablename nvarchar(30),
@id int,
@SQLStr nvarchar(1000)
SET @id = 1
WHILE (@id < 9)
BEGIN
select @tablename = name from temptablenames where id = @id

IF OBJECT_ID('tempga0') IS NOT NULL
DROP TABLE tempga0

    set @SQLStr = 'select _key_out, sum(quality_score) as sumscore, count(*) as reccount, (sum(quality_score) / count(*)) as ave
into tempga0
from ' + @tablename + ' group by _key_out'

    exec(@SQLStr)


 SET @id = @id + 1 
END
GO

1 Ответ

1 голос
/ 13 марта 2012

Используйте команду Exec.Напишите ваш запрос в переменной вроде и выполните его

Declare @SQLStr = 'Select * into X from ' + @tablename
exec(@SQLStr)

Вы просто должны быть осторожны.Я вижу, что вы используете в заявлениях.Вам нужно будет проверить, что таблица еще не существует, потому что вы получите исключение.Вам нужно будет отбросить таблицы, или лучше сделать это до того, как вы начнете цикл:

CREATE TABLE tempga0 (
_key_out int,
sumscore numeric(18,9),
reccount int,
ave numeric(18,9))

--rest of the tables to be created here...

Создайте все таблицы, а когда вы начнете цикл While, добавьте

WHILE (@id < 9)         
BEGIN    
    TRUNCATE TABLE tempga0
    --truncate the rest of the tables

    --Do the rest of your stuff here
END

Надеюсь, это поможет

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