动态查询过程
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)
我有类似的问题: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)