动态查询过程

Procedure with Dynamic Query

我有类似的问题:Stored Procedure with Dynamic Query 但我做不到。我有100个类似的table,我想做动态程序,但是不行。

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

好的,所以我在 mssql 服务器中有 100 个 tables country c,我不想为彼此编写 100 个存储过程,而是为所有这些编写一个。

这是一个程序的代码table

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 ...

示例视图 table 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服务器returns这个错误:

Msg 102, Level 15, State 1, Procedure Tabela, Line 12 [Batch Start Line 1]
Incorrect syntax near ')'

我改table名字

这是一个国家的联合查询

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   

这是SQL服务器,还是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 tables 合并为一个结果?

最后让我们看看一些输入。因此,请通过 运行 粘贴并粘贴

中的第 1、5 或 10 行来向我们显示这些 table 名称
USE StackOver-or-your-db-name; 

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

和一个输入DDL的结构。

和table中的前几行数据,说POR

当您说它不起作用时,请告诉我们 SQL 中的行和收到的消息。

------------ 2 月 24 日凌晨 1 点

进展顺利。让我们不要创建 proc 1st,而是让 sql 工作。
请将 arg @zwyc 更改为与 table 名称不同的名称以避免混淆;也许@cname.

请打印几行正在加入的table zwyc。 这是我正在测试的内容。我添加了很多双引号来包围 varchar args。在 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)

------------ 2 月 24 日 13:30 PDT

效果好吗?使用修改后的 args 周围的单引号对,它似乎可以工作。

总是提供所有 3 个参数吗?或者其中一些可能是 null/not 提供的?

我注意到 列表中的 p.country 总是 'Poland'

我们为什么加入?我们只返回 1 行吗?好像我们得到 12 行左右...

join zwyciezcy z  on p.Country=z.Country 

然后这 12 行按团队名称过滤为只有一个。

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

但是我们没有使用 table zwyciezcy z 中的其他列。那么为什么要执行连接?

请打印几行正在加入的table zwyciezcy。

您的查询问题: 在您的动态查询中,您没有正确处理 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)