动态SQL Server存储过程 [英] Dynamic SQL Server stored procedure
问题描述
您好b $ b有人可以帮忙吗?当我把它作为一个存储过程时,这个查询不起作用!!!
也许我有更少的引号/引号/
< pre lang =SQL> ALTER PROC spVM
(
@ Table_Name sysname,
@ Table_Name2 sysname
)
AS
BEGIN
SET NOCOUNT OFF ;
DECLARE @ Dynamictbl nvarchar ( 255 )
SET @ Dynamictbl =
N ' SELECT DISTINCT
t1。[ Projektdefinition DB] AS [Projektdefinition DB 201409BS],
t1。[Projektdefinition DB1] AS [Projektbezeichung DB 201409BS],
t1。[GWU Vorschau mit AZ] AS [GWU_Per201409BS_IST],
t2。[GWU Vorschau mit AZ] AS [GWU_Per201408BS IST],
t1。[GWU Vorschau mit AZ] - t2。[GWU Vorschau mit AZ] AS [GWU IST DELTA],
t1。[GWU Planung mit AZ] AS [GWU Per201409BS SOLL],
t2。[GWU Planung mit AZ] AS [GWU_SOLL],
t1。[GWU Planung mit AZ] - t2。[ GWU Planung mit AZ] AS [GWU SOLL DELTA],
t1。[IST Vorjahre mit AZ] AS [Ist Vorjahre],
t2。[IST Vorjahre mit AZ] AS [Ist Vorjahre ],
t1。[Ist Vorjahr mit AZ] AS [Ist Vorjahr],
t2。[Ist Vorjahr mit AZ] AS [Ist Vorjahr],
t1。[IST lfd#GJ mit AZ] AS [Ist lfd GJ],
t2。[IST lfd #GJ mit AZ] AS [Ist lfd GJ],
t1。[Obligo BANF lfd#GJ] AS [ Obligo BANF Ifd GJ],
t2。[Obligo BANF lfd#GJ] AS [Obligo BANF Ifd GJ],
t1。[Vorschau lfd #GJ mit AZ] AS [Vorschau Ifd GJ ],
t2。[Vorschau lfd #GJ mit AZ] AS [Vorschau Ifd GJ],
t1。[Vorschau Folgejahr mit AZ] AS [Vorschau Folgejahr],
t2 。[Vorschau Folgejahr mit AZ] AS [Vorschau Folgejahr],
t1。[Vorschau GJ + 02 mit AZ] AS [Vorschau GJ + 02],
t2。[Vorschau GJ + 02 mit AZ] AS [Vorschau GJ + 02],
t1。[Vorschau GJ + 03 mit AZ] AS [Vorschau GJ + 03],
t2。[Vorschau GJ + 03 mit AZ ] AS [Vorschau GJ + 03],
t1。[Vorschau GJ + 04 mit AZ] AS [Vorschau GJ + 04],
t2。[Vorschau GJ + 04 mit AZ] AS [Vorschau GJ + 04],
t1。[Vorschau GJ + 05 mit AZ] AS [Vorschau GJ + 05],
t2。[Vorschau GJ + 05 mit AZ] AS [ Vorschau GJ + 05],
t1。[Vorschau GJ + 06 mit AZ] AS [Vorschau GJ + 06],
t2。[Vorschau GJ + 06 mit AZ] AS [Vorschau GJ +06],
t1。[Vorschau GJ + 07 mit AZ] AS [Vorschau GJ + 07],
t2。[Vorschau GJ + 07 mit AZ] AS [Vorschau GJ + 07 ],
t1。[Planung GJ + 06 mit AZ] AS [Planung GJ + 06],
t2。[Planung GJ + 06 mit AZ] AS [Planung GJ] +06],
t1。[IST lfd#GJ zum Obligostichtag mit AZ] AS [Obligostichtag],
t2。[IST lfd#GJ zum Obligostichtag mit AZ] AS [Obligostichtag]
FROM' + @ Table_Name + ' AS t1
LEFT OUTER JOIN' + @ Table_Name2 + ' AS t2
ON t1。[Projektdefinition DB] = t2。[Projektdefinition DB]
WHERE t1。[Geschäftsbereich] ='' PB''和't2。[Geschäftsbereich] =''PB''' +
' ORDER BY t1。[Projektdefinition DB] ASC'
EXECUTE sp_executesql @ Dynamictbl
END
GO
EXEC spVM ' tbl2 ',' tbl1' 嗨mikybrain,
我建议您运行动态查询并使用SQL事件探查器来获取已解析的T-SQL来自SQL事件探查器的脚本并将该SQL转换为存储过程。
如果您没有执行SQL事件探查器的权限,您还可以尝试使用链接中的Express Profiler来抓取你最后的T-SQL查询。
Standalone sql profiler - ExpressPreofiler [ ^ ]
https://expressprofiler.codeplex.com [ ^ ]
your main问题是变量的长度@Dynamictbl nvarchar(255)
应该是
DECLARE @ Dynamictbl nvarchar (MAX)
更新它并执行你的sp并查看结果。
请参阅t2部分。[Planung GJ + 05 mit AZ] AS Planung GJ + 05,
FROM ' + @Table_Name +'AS t1
你在最后一列之后有一个逗号 - 这会引发错误。尝试将其更改为t2。[Planung GJ + 05 mit AZ] AS Planung GJ + 05
FROM ' < span class =code-comment> + @Table_Name +'AS t1
我也同意来自的评论Umer Akram - 使用方括号[]而不是双引号使其更清晰
此外,您的查询超过255个字符 - 将声明更改为DECLARE @ Dynamictbl nvarchar ( MAX)
Hi
Can someone help? This query isn't working when i make it a stored procedure!!!
Maybe i have less inverted commas / quotation marks
ALTER PROC spVM
(
@Table_Name sysname,
@Table_Name2 sysname
)
AS
BEGIN
SET NOCOUNT OFF;
DECLARE @Dynamictbl nvarchar(255)
SET @Dynamictbl =
N'SELECT DISTINCT
t1.[Projektdefinition DB] AS [Projektdefinition DB 201409BS],
t1.[Projektdefinition DB1] AS [Projektbezeichung DB 201409BS],
t1.[GWU Vorschau mit AZ] AS [GWU_Per201409BS_IST],
t2.[GWU Vorschau mit AZ] AS [GWU_Per201408BS IST],
t1.[GWU Vorschau mit AZ] - t2.[GWU Vorschau mit AZ] AS [GWU IST DELTA],
t1.[GWU Planung mit AZ] AS [GWU Per201409BS SOLL],
t2.[GWU Planung mit AZ] AS [GWU_SOLL],
t1.[GWU Planung mit AZ] - t2.[GWU Planung mit AZ] AS [GWU SOLL DELTA],
t1.[IST Vorjahre mit AZ] AS [Ist Vorjahre],
t2.[IST Vorjahre mit AZ] AS [Ist Vorjahre],
t1.[Ist Vorjahr mit AZ] AS [Ist Vorjahr],
t2.[Ist Vorjahr mit AZ] AS [Ist Vorjahr],
t1.[IST lfd#GJ mit AZ] AS [Ist lfd GJ],
t2.[IST lfd#GJ mit AZ] AS [Ist lfd GJ],
t1.[Obligo BANF lfd# GJ] AS [Obligo BANF Ifd GJ],
t2.[Obligo BANF lfd# GJ] AS [Obligo BANF Ifd GJ],
t1.[Vorschau lfd# GJ mit AZ] AS [Vorschau Ifd GJ],
t2.[Vorschau lfd# GJ mit AZ] AS [Vorschau Ifd GJ],
t1.[Vorschau Folgejahr mit AZ] AS [Vorschau Folgejahr],
t2.[Vorschau Folgejahr mit AZ] AS [Vorschau Folgejahr],
t1.[Vorschau GJ+02 mit AZ] AS [Vorschau GJ+02],
t2.[Vorschau GJ+02 mit AZ] AS [Vorschau GJ+02],
t1.[Vorschau GJ+03 mit AZ] AS [Vorschau GJ+03],
t2.[Vorschau GJ+03 mit AZ] AS [Vorschau GJ+03],
t1.[Vorschau GJ+04 mit AZ] AS [Vorschau GJ+04],
t2.[Vorschau GJ+04 mit AZ] AS [Vorschau GJ+04],
t1.[Vorschau GJ+05 mit AZ] AS [Vorschau GJ+05],
t2.[Vorschau GJ+05 mit AZ] AS [Vorschau GJ+05],
t1.[Vorschau GJ+06 mit AZ] AS [Vorschau GJ+06],
t2.[Vorschau GJ+06 mit AZ] AS [Vorschau GJ+06],
t1.[Vorschau GJ+07 mit AZ] AS [Vorschau GJ+07],
t2.[Vorschau GJ+07 mit AZ] AS [Vorschau GJ+07],
t1.[Planung GJ+06 mit AZ] AS [Planung GJ+06],
t2.[Planung GJ+06 mit AZ] AS [Planung GJ+06],
t1.[IST lfd# GJ zum Obligostichtag mit AZ] AS [Obligostichtag],
t2.[IST lfd# GJ zum Obligostichtag mit AZ] AS [Obligostichtag]
FROM ' + @Table_Name + ' AS t1
LEFT OUTER JOIN ' + @Table_Name2 + ' AS t2
ON t1.[Projektdefinition DB] = t2.[Projektdefinition DB]
WHERE t1.[Geschäftsbereich] = ''PB'' AND t2.[Geschäftsbereich] = ''PB''' +
' ORDER BY t1.[Projektdefinition DB] ASC '
EXECUTE sp_executesql @Dynamictbl
END
GO
EXEC spVM 'tbl2', 'tbl1'
Hi mikybrain,
I would suggest you to run your dynamic query and use SQL Profiler to grab the parsed T-SQL script from SQL Profiler and convert that SQL to stored procedures.
If you dont have rights to execute SQL profiler, you can also try Express Profiler available in the link to grab your final T-SQL Query.
Standalone sql profiler - ExpressPreofiler[^]
https://expressprofiler.codeplex.com[^]
your main issue is the length of your variable @Dynamictbl nvarchar(255)
its should be
DECLARE @Dynamictbl nvarchar(MAX)
update it and execute your sp and see the result.
See the sectiont2.[Planung GJ+05 mit AZ] AS "Planung GJ+05", FROM ' + @Table_Name + ' AS t1
You have a comma after the last column - this will throw an error. Try changing it tot2.[Planung GJ+05 mit AZ] AS "Planung GJ+05" FROM ' + @Table_Name + ' AS t1
I also agree with the comment from Umer Akram - use square brackets [] instead of double quotes to make it clearer
Also your query is longer than 255 characters - change the declare toDECLARE @Dynamictbl nvarchar(MAX)
这篇关于动态SQL Server存储过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!