使用动态查询的过程

问题描述 投票:0回答:2

我有类似的问题:Stored Procedure with Dynamic Query但我做不到。我有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

好的,所以我在mssql服务器上有100个表country c,我不想彼此写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,Level 15,State 1,Procedure Tabela,Line 12 [Batch Start Line 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   
sql sql-server dynamic procedure
2个回答
0
投票

这是SQL Server,MySQL,Oracle,MS Access,还是......什么?请更改与问题相关的标签。答案需要相应更改。

请编辑第一个问题,而不是开始新的答案,并在最后添加>>>>的分隔符,然后粘贴您的更正或修订,保留其上方的所有内容。

然后,请注意

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张桌子加入到一个结果中?

最后让我们看一些输入。因此,请通过运行和粘贴第1行或第10行来向我们显示这些表名

USE StackOver-or-your-db-name; 

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

并且输入DDL的结构。

POR说,表格中的前几行数据

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

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

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

请打印几行正在连接的表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个参数?或者他们中的一些可能为空/未提供?

我注意到列表中的p.country始终是'波兰'

我们为什么加入?我们只得到一排吗?好像我们得到12行......

join zwyciezcy z  on p.Country=z.Country 

然后,这12行将按团队名称过滤为仅一行。

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

但我们不使用表zwyciezcy z中的其他列。那么为什么要加入呢?

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


0
投票

您的查询中的问题:在动态查询中,您没有正确处理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)
© www.soinside.com 2019 - 2024. All rights reserved.