【发布时间】:2020-04-08 21:22:57
【问题描述】:
当我尝试执行下面的存储过程时出现以下错误:
Must declare the scalar variable "@p1"
我不明白为什么或如何解决,任何帮助将不胜感激。谢谢
存储过程:
USE [SERVER_NAME]
GO
/****** Object: StoredProcedure [dbo].[APP_jdtest_shp_0] Script Date: 16/12/2019 11:13:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[jdtest_shp_0]
@p1 nvarchar(100),
@n nvarchar(100)
AS
EXEC('
CREATE VIEW dbo.[' + @n + '] AS
SELECT
RTRIM([F].[F_CODE]) As F_UID ,
RTRIM([TP].[F_TP_NAME]) As F_TP_UID ,
RTRIM([NS].[F_CODE]) AS F_CODE,
RTRIM([NS].[SOME_DATE]) AS SOME_DATE,
RTRIM([NS].[ANOTHER_DATE]) AS ANOTHER_DATE,
RTRIM([NS].[SPD]) AS SPD,
RTRIM([NS].[LK_DATE]) AS LK_DATE,
RTRIM([NS].[RC_DATE]) AS RC_DATE,
RTRIM([NS].[RD_DATE]) AS RD_DATE,
RTRIM([NS].[OLD_UID]) AS OLD_UID,
RTRIM([NS].[VN]) AS VN,
RTRIM([NS].[R_I]) AS R_I,
RTRIM([NS].[WTU_UID]) AS WTU_UID,
RTRIM([NS].[D_LT]) AS D_LT,
RTRIM([PLT_UD].[PLT]) As L_A_PLT_UD_UID ,
RTRIM([RT].[RT_NAME]) As RT_UID ,
RTRIM([SS].[S_S_NAME]) As S_S_UID ,
RTRIM([NS].[S_DATE]) AS S_DATE,
RTRIM([SUR].[S_SUR_NAME]) As S_SUR_UID ,
RTRIM([NS].[S_TOL]) AS S_TOL,
RTRIM([LKP_AUTH].[AUTH_NAME]) As AUTH_UID ,
[NS].[S_G] AS S_G,
RTRIM([NS].[NS_UID]) AS NS_UID,
RTRIM([NSG_C].[C_NAME]) As C_UID ,
RTRIM([NS].[CLT]) AS CLT,
RTRIM([NS].[ONR_UID]) AS ONR_UID,
RTRIM([NC].[S_CLF_NAME]) As S_CLF_UID ,
RTRIM([NS].[XP]) AS XP,
RTRIM([NS].[CSTART_X]) AS CSTART_X,
RTRIM([NS].[CSTART_Y]) AS CSTART_Y,
RTRIM([NS].[CEND_X]) AS CEND_X,
RTRIM([NS].[CEND_Y]) AS CEND_Y
FROM NS
LEFT OUTER JOIN F ON NS.F_UID = F.F_UID
LEFT OUTER JOIN FT ON NS.F_TP_UID = FT.FT_UID
LEFT OUTER JOIN PLT_UD ON NS.L_A_PLT_UD_UID = SEC_PLT_UD.PLT_UD_UID
LEFT OUTER JOIN RT ON NS.RT_UID = RT.RT_UID
LEFT OUTER JOIN STT ON NS.S_S_UID = SS.S_S_UID
LEFT OUTER JOIN SUR ON NS.S_SUR_UID = SUR.S_SUR_UID
LEFT OUTER JOIN AUTH ON NS.AUTH_UID = AUTH.AUTH_UID
LEFT OUTER JOIN C ON NS.C_UID = C.C_UID
LEFT OUTER JOIN NSC ON NS.S_CLF_UID = NSC.S_CLF_UID
WHERE
([NS].[SHAPE_GEOMETRY].STIntersects(Geometry::STGeomFromText(' + '@p1' + ', 0).MakeValid())>0) AND
([NS].[S_G].STGeometryTP() = ''POINT'') '
)
编辑:使用 sql server 2014。这不是我的代码,我正在尝试修复其他人代码中的错误。
更新:更新了“执行命令”部分以显示过程是如何执行的
【问题讨论】:
-
在动态 SQL 中使用格式以提高可读性与格式化非动态 SQL 一样同样重要。
-
您的答案向您展示了正确的做事方式。但是,如果您只是选择生成的字符串作为用于调试目的的输出,那么您的代码问题就会很明显。然后您会注意到您只是在查询中嵌入了参数的名称 - 当您打算嵌入字符串中包含的值时。如果你想写动态sql,你必须能看到生成的代码来调试它。
-
您需要一个存储过程来创建一个非常、非常特定的视图,这有点奇怪。更重要的是,现在完全不支持sql server 2008;应该有人对此感到担忧。
-
抱歉,我忘了我们几周前更新到 sql server 2014。这也不是我的代码,而是别人的,我只是想修复这个错误。
-
我不明白为什么你需要像这样一遍又一遍地生成视图。为什么不接收@p1 的过程或视图并在从中选择时使用 where 子句?生成一个又一个视图,只对 where 谓词稍作更改就表明存在设计问题。
标签: sql asp.net sql-server vb.net sql-server-2014