动态SQL Server存储过程 [英] Dynamic SQL Server stored procedure

查看:76
本文介绍了动态SQL Server存储过程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好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 section

t2.[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 to

t2.[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 to

DECLARE @Dynamictbl nvarchar(MAX)


这篇关于动态SQL Server存储过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆