Процедура с динамическим запросом - PullRequest
0 голосов
/ 23 февраля 2019

У меня похожая проблема: Хранимая процедура с динамическим запросом , но я не могу этого сделать.У меня есть 100 подобных таблиц, и я хочу сделать динамическую процедуру, но она не работает.

create or alter procedure Tab  
(
    @z nvarchar(50) = ISNULL,
    @s varchar(30) = ISNULL,
    @l nvarchar(30) = ISNULL)
as 
begin
    Declare @SQLQuery NVARCHAR(50)

    exec ('select * from'  + @l)  as p 
           join z as z on p.C = z.C 
           where @z in (home, away)
             and p.s = @s 
             and z = @z
 end

Хорошо, поэтому у меня есть 100 таблиц страна c на сервере mssql, и я не хочунаписать 100 хранимых процедур друг другу, но вместо этого написать одну для всего этого.

Это код процедуры для одной таблицы

create or alter procedure Tabela  
    (@zwyc  nvarchar(50) = ISNULL ,
     @season nvarchar(50) = ISNULL ,
     @lig nvarchar(50) = ISNULL)
as 
begin
    Declare @SQL NVARCHAR(max)
    set @SQL = 'select * from '+@lig+' as p 
    join zwyc z on p.Country=z.Country 
    where '+@zwyc+' in  (home, away) 
    and p.season = '+@season+' and z.zwyc = '+@zwyc
    exec (@sql)
go

, и теперь я хочу создать динамический запрос в хранимой процедуре для подключения ко всем странам POR, GER, SWE, ENG...

пример таблицы представления POL (@lig)

IDPOL   Country League  Season  data    Time    Home    Away    
1   Poland  Ekstraklasa 2012/2013   2012-08-17  17:00:00.0000000    Pogon Szczecin  Zaglebie    
2   Poland  Ekstraklasa 2012/2013   2012-08-17  19:30:00.0000000    Piast Gliwice   Gornik Z.   
3   Poland  Ekstraklasa 2012/2013   2012-08-18  12:30:00.0000000    Jagiellonia Podbeskidzie    
4   Poland  Ekstraklasa 2012/2013   2012-08-18  14:45:00.0000000    Widzew Lodz Slask Wroclaw   
5   Poland  Ekstraklasa 2012/2013   2012-08-18  17:00:00.0000000    Lech Poznan Ruch    
6   Poland  Ekstraklasa 2012/2013   2012-08-19  13:30:00.0000000    Wisla   GKS Belchatow   
7   Poland  Ekstraklasa 2012/2013   2012-08-19  16:00:00.0000000    Legia   Korona Kielce   
8   Poland  Ekstraklasa 2012/2013   2012-08-20  17:30:00.0000000    Lechia Gdansk   Polonia Warszawa    
9   Poland  Ekstraklasa 2012/2013   2012-08-24  17:00:00.0000000    Zaglebie    Piast Gliwice   
10  Poland  Ekstraklasa 2012/2013   2012-08-24  19:30:00.0000000    Jagiellonia Gornik Z.   

SQL Server возвращает эту ошибку:

Msg 102, уровень 15, состояние 1,Процедура Табела, Строка 12 [Стартовая Строка 1]
Неверный синтаксис рядом с ')'

Я изменяю имя таблицы

Вот объединенный запрос для одной страны

select top 10 
    IDPOL, p.country, p.league, p.Season, data, time ,home, away 
from 
    POL p
join 
    zwyciezcy z on p.Country = z.Country 
where 
    p.Season = '2012/2013'
    and z.Zwyciezca = 'Slask Wroclaw'
    and (home = 'Slask Wroclaw' or away = 'Slask Wroclaw')

и вот результат

IDPOL   country league  Season  data    time    home    away    
-----------------------------------------------------------------------
4   Poland  Ekstraklasa 2012/2013   2012-08-18  14:45:00.0000000    Widzew Lodz Slask Wroclaw   
14  Poland  Ekstraklasa 2012/2013   2012-08-26  13:30:00.0000000    Slask Wroclaw   Korona Kielce   
23  Poland  Ekstraklasa 2012/2013   2012-09-02  16:00:00.0000000    Slask Wroclaw   Ruch    
25  Poland  Ekstraklasa 2012/2013   2012-09-14  17:00:00.0000000    Podbeskidzie    Slask Wroclaw   
38  Poland  Ekstraklasa 2012/2013   2012-09-23  13:30:00.0000000    Slask Wroclaw   GKS Belchatow   
46  Poland  Ekstraklasa 2012/2013   2012-09-30  13:30:00.0000000    Gornik Z.   Slask Wroclaw   
55  Poland  Ekstraklasa 2012/2013   2012-10-07  16:00:00.0000000    Slask Wroclaw   Polonia Warszawa    
62  Poland  Ekstraklasa 2012/2013   2012-10-21  13:30:00.0000000    Lechia Gdansk   Slask Wroclaw   
70  Poland  Ekstraklasa 2012/2013   2012-10-28  13:30:00.0000000    Slask Wroclaw   Zaglebie    
80  Poland  Ekstraklasa 2012/2013   2012-11-05  17:30:00.0000000    Pogon Szczecin  Slask Wroclaw   

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Проблема в вашем запросе: В динамическом запросе вы неправильно обрабатываете z.Zwyciezca = 'Slask Wroclaw'.То, как вы справляетесь с этим: z.Zwyciezca = Slask Wroclaw без '

select *
from 
    POL p
join 
    zwyciezcy z on p.Country = z.Country 
where 
    p.Season = '2012/2013'
    and z.Zwyciezca = 'Slask Wroclaw'
    and (home = 'Slask Wroclaw' or away = 'Slask Wroclaw')

Пример динамического запроса для выше должен выглядеть так:

Declare @SQL NVARCHAR(max)
    set @SQL = 'select * from '+@lig+' as p 
    join SomeTable z on p.columnname= z.columnname
    where p.columnName in  (''home'', ''away'') 
    and p.anothercolumn= '''+@season + ''''

    print @SQL
    exec (@sql)
0 голосов
/ 24 февраля 2019

Это SQL Server, или MySQL, или Oracle, или MS Access, или ... что?Пожалуйста, измените TAG, связанный с вопросом.Ответы необходимо будет соответствующим образом изменить.

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

Затем, имейте в виду, что

Declare @SQL NVARCHAR(50)  

должно быть (500) (или больше), потому что то, что мы придумаем, может быть длинным SQL.

То, что я получил от второго SQL, было

select * 
from LLL as p 
join z as z on p.C = z.C 
wher

, которое было усечено после 50 символов.

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

Кроме того, аргументы не должны быть отдельными буквами (@z, @s, @l, а также s, z, p, ...), но должны быть описательными.

Наконец, нам нужно начать с того, как будет выглядеть вывод.

Кажется, что в процедуре SQL есть только select с объединением.Это должно быть выполнено 100 раз?100 результатов?

Или мы пытаемся объединить 100 таблиц в ОДИН результат?

Наконец, давайте посмотрим некоторые входные данные.Поэтому, пожалуйста, покажите нам эти имена таблиц, запустив и вставив первые 5 или 10 строк из

USE StackOver-or-your-db-name; 

SELECT name, max_column_id_used 
FROM sys.Tables  (maybe, WHERE name like 'xxx*')

И структуру одного входного DDL.

И первые несколько строк данных вскажем, POR

Когда вы скажете, что это не работает, сообщите нам строку в SQL и полученное сообщение.

---------- 24 февраля 1:00

Хороший прогресс.Давайте не будем создавать proc 1st, а вместо этого заставим работать sql.
Пожалуйста, измените arg @zwyc на другое имя, отличное от имени таблицы, чтобы избежать путаницы;может быть @ cname.

Пожалуйста, напечатайте несколько строк таблицы zwyc, к которой присоединяется.Вот что я тестирую.Я добавил много пар кавычек, чтобы окружить их.И прямо перед EXEC я добавил

 Print @sql

, чтобы посмотреть, какой SQL будет выполняться.Затем измените мои значения sql arg на те, которые вам подходят, и вставьте обратно в вашу область выше, чтобы я знал, что вы пытались ... отмечая любые дальнейшие проблемы ...

 Declare
         @zwyc  nvarchar(50) = 'Poland' ,
         @season nvarchar(50) = '2012/2013' ,
         @ateam nvarchar(50) = 'Wisla',
         @lig nvarchar(50) = '[StackOver].[dbo].[DynamicQueryPOL]'

        Declare @SQL NVARCHAR(max)
        set @SQL = 'select * from ' + @lig + ' as p 
        join zwyc z on p.Country=z.Country 
        where ( p.home =  ''' + @ateam + '''   OR  p.away  = ''' + @ateam + ''' ) 
        and p.season = ''' + @season + ''' and z.zwyc = ''' + @zwyc + ''''
        print @sql
        --exec (@sql)

---------- 24 февраля 13:30 PDT

Хороши ли результаты?С исправленными парами одинарных кавычек вокруг аргументов это, кажется, работает.

Всегда ли предоставлены все 3 аргумента?Или некоторые из них могут быть нулевыми / не предоставлены?

Я заметил, что p.country в списке всегда 'Польша'

Почему мы присоединяемся?Мы получаем только 1 ряд назад?Похоже, мы получаем около 12 строк ...

join zwyciezcy z  on p.Country=z.Country 

И эти 12 строк затем фильтруются по названию команды только в одну.

where ::: z.Zwyciezca='Slask Wroclaw'

Но мы не используем другие столбцы изтаблица zwyciezcy z.Так почему же выполняется соединение?

Пожалуйста, напечатайте несколько строк таблицы zwyciezcy, к которой присоединяется.

...