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