SQL EXEC过程:";必须声明标量变量"@p1";

SQL EXEC过程:";必须声明标量变量"@p1";,sql,asp.net,sql-server,vb.net,sql-server-2014,Sql,Asp.net,Sql Server,Vb.net,Sql Server 2014,当我尝试执行以下存储过程时,出现以下错误: 必须声明标量变量“@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 PRO

当我尝试执行以下存储过程时,出现以下错误:

必须声明标量变量“@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。这不是我的代码,我正在尝试修复其他人代码中的错误


更新:更新了“执行命令”部分,以显示过程是如何执行的

如果要在动态语句中使用参数,则需要使用
sp_executesql
而不是
EXEC()

CREATE PROCEDURE [dbo].[123456] 
    @p1 nvarchar(100),  
    @n nvarchar(100) 
AS 
BEGIN
    DECLARE @stm nvarchar(max)
    DECLARE @err int

    SET @stm = 
        N'CREATE VIEW dbo.' + QUOTENAME(@n) + N' AS ' +
        N'SELECT 
            RTRIM([FEATURE].[FEATURE_CODE]) As FEATURE_UID ,  
            RTRIM([FEATURE_TYPE].[FEATURE_TYPE_NAME]) As FEATURE_TYPE_UID ,  
            RTRIM([NSG_STREETS].[FEATURE_CODE]) AS FEATURE_CODE,  
            RTRIM([NSG_STREETS].[START_DATE]) AS START_DATE,  
            RTRIM([NSG_STREETS].[END_DATE]) AS END_DATE,  
            RTRIM([NSG_STREETS].[SUSPEND_ACTIVITIES]) AS SUSPEND_ACTIVITIES,  
            RTRIM([NSG_STREETS].[RECORD_ENTRY_DATE]) AS RECORD_ENTRY_DATE,  
            RTRIM([NSG_STREETS].[RECORD_CHANGE_DATE]) AS RECORD_CHANGE_DATE,  
            RTRIM([NSG_STREETS].[RECORD_DELETE_DATE]) AS RECORD_DELETE_DATE,  
            RTRIM([NSG_STREETS].[OLD_SYSTEM_UID]) AS OLD_SYSTEM_UID,  
            RTRIM([NSG_STREETS].[VERSION_NUMBER]) AS VERSION_NUMBER,  
            RTRIM([NSG_STREETS].[RECORD_IDENTIFIER]) AS RECORD_IDENTIFIER,  
            RTRIM([NSG_STREETS].[WARD_UID]) AS WARD_UID,  
            RTRIM([NSG_STREETS].[DIGITAL_LENGTH]) AS DIGITAL_LENGTH,  
            RTRIM([SEC_USER].[USER_NAME]) As LAST_EDIT_USER_UID ,  
            RTRIM([LKP_RECORD_TYPE].[RECORD_TYPE_NAME]) As RECORD_TYPE_UID ,  
            RTRIM([LKP_STREET_STATE].[STREET_STATE_NAME]) As STREET_STATE_UID ,  
            RTRIM([NSG_STREETS].[STATE_DATE]) AS STATE_DATE,  
            RTRIM([LKP_STREET_SURFACE].[STREET_SURFACE_NAME]) As STREET_SURFACE_UID ,  
            RTRIM([NSG_STREETS].[STREET_TOLERANCE]) AS STREET_TOLERANCE,  
            RTRIM([LKP_AUTHORITY].[AUTHORITY_NAME]) As AUTHORITY_UID ,  
            [NSG_STREETS].[SHAPE_GEOGRAPHY] AS SHAPE_GEOGRAPHY,  
            RTRIM([NSG_STREETS].[NSG_STREETS_UID]) AS NSG_STREETS_UID,  
            RTRIM([NSG_COUNTY].[COUNTY_NAME]) As COUNTY_UID ,  
            RTRIM([NSG_STREETS].[CLASS_UID]) AS CLASS_UID,  
            RTRIM([NSG_STREETS].[OWNER_UID]) AS OWNER_UID,  
            RTRIM([NSG_STREET_CLASSIFICATION].[STREET_CLASSIFICATION_NAME]) As STREET_CLASSIFICATION_UID ,  
            RTRIM([NSG_STREETS].[EXPORT]) AS EXPORT,  
            RTRIM([NSG_STREETS].[CSTART_X]) AS CSTART_X,  
            RTRIM([NSG_STREETS].[CSTART_Y]) AS CSTART_Y,  
            RTRIM([NSG_STREETS].[CEND_X]) AS CEND_X,  
            RTRIM([NSG_STREETS].[CEND_Y]) AS CEND_Y FROM NSG_STREETS  
        LEFT OUTER JOIN FEATURE ON NSG_STREETS.FEATURE_UID = FEATURE.FEATURE_UID 
        LEFT OUTER JOIN FEATURE_TYPE ON NSG_STREETS.FEATURE_TYPE_UID = FEATURE_TYPE.FEATURE_TYPE_UID 
        LEFT OUTER JOIN SEC_USER ON NSG_STREETS.LAST_EDIT_USER_UID = SEC_USER.USER_UID 
        LEFT OUTER JOIN LKP_RECORD_TYPE ON NSG_STREETS.RECORD_TYPE_UID = LKP_RECORD_TYPE.RECORD_TYPE_UID 
        LEFT OUTER JOIN LKP_STREET_STATE ON NSG_STREETS.STREET_STATE_UID = LKP_STREET_STATE.STREET_STATE_UID 
        LEFT OUTER JOIN LKP_STREET_SURFACE ON NSG_STREETS.STREET_SURFACE_UID = LKP_STREET_SURFACE.STREET_SURFACE_UID 
        LEFT OUTER JOIN LKP_AUTHORITY ON NSG_STREETS.AUTHORITY_UID = LKP_AUTHORITY.AUTHORITY_UID 
        LEFT OUTER JOIN NSG_COUNTY ON NSG_STREETS.COUNTY_UID = NSG_COUNTY.COUNTY_UID 
        LEFT OUTER JOIN NSG_STREET_CLASSIFICATION ON NSG_STREETS.STREET_CLASSIFICATION_UID = NSG_STREET_CLASSIFICATION.STREET_CLASSIFICATION_UID 
        WHERE  
            ([NSG_STREETS].[SHAPE_GEOMETRY].STIntersects(Geometry::STGeomFromText(@p1, 0).MakeValid())>0) AND  
            ([NSG_STREETS].[SHAPE_GEOGRAPHY].STGeometryType() = ''POINT'')  '

    EXEC @err = sp_executesql @stm, N'@p1 nvarchar(100)', @p1

    IF @err <> 0 BEGIN
        PRINT 'Error'
        RETURN @err
    END
END
创建过程[dbo]。[123456]
@p1 nvarchar(100),
@n nvarchar(100)
像
开始
声明@stm nvarchar(最大值)
声明@err int
设置@stm=
N'CREATE VIEW dbo.'+QUOTENAME(@N)+N'AS'+
N'SELECT
RTRIM([FEATURE].[FEATURE\u CODE])作为FEATURE\u UID,
RTRIM([FEATURE\u TYPE]。[FEATURE\u TYPE\u NAME])作为FEATURE\u TYPE\u UID,
RTRIM([NSG_街道].[FEATURE_代码])作为FEATURE_代码,
RTRIM([NSG_STREETS].[START_DATE])作为开始日期,
RTRIM([NSG_街道][结束日期])作为结束日期,
RTRIM([NSG_街道].[SUSPEND_活动])作为SUSPEND_活动,
RTRIM([NSG\U STREETS].[RECORD\u ENTRY\u DATE])作为RECORD\u ENTRY\u DATE,
RTRIM([NSG街道][记录变更日期])作为记录变更日期,
RTRIM([NSG\U STREETS].[RECORD\u DELETE\u DATE])作为RECORD\u DELETE\u DATE,
RTRIM([NSG_STREETS].[OLD_SYSTEM_UID])作为OLD_SYSTEM_UID,
RTRIM([NSG\U街道][版本号])作为版本号,
RTRIM([NSG_STREETS].[RECORD_IDENTIFIER])作为记录标识符,
RTRIM([NSG_街道][WARD_UID])作为WARD_UID,
RTRIM([NSG_STREETS].[DIGITAL_LENGTH])作为数字长度,
RTRIM([SEC_USER].[USER_NAME])作为最后一个编辑用户UID,
RTRIM([LKP\U记录类型].[RECORD\U类型名称])作为记录类型UID,
RTRIM([LKP_STREET_STATE]。[STREET_STATE_NAME])作为STREET_STATE的UID,
RTRIM([NSG_街道][州日期])作为州日期,
RTRIM([LKP_STREET_SURFACE]。[STREET_SURFACE_NAME])作为STREET_SURFACE_UID,
RTRIM([NSG_STREETS].[STREET_TOLERANCE])作为STREET_TOLERANCE,
RTRIM([LKP_AUTHORITY].[AUTHORITY_NAME])作为AUTHORITY_UID,
[NSG_街道][SHAPE_地理]作为SHAPE_地理,
RTRIM([NSG_STREETS].[NSG_STREETS_UID])作为NSG_STREETS_UID,
RTRIM([NSG_COUNTY].[COUNTY_NAME])作为县UID,
RTRIM([NSG_街道].[CLASS_UID])作为CLASS_UID,
RTRIM([NSG_街道].[OWNER_UID])作为OWNER_UID,
RTRIM([NSG街道分类][街道分类名称])作为街道分类UID,
RTRIM([NSG_STREETS].[EXPORT])作为出口,
RTRIM([NSG_街道][CSTART_X])作为CSTART_X,
RTRIM([NSG_街道][CSTART_Y])作为CSTART_Y,
RTRIM([NSG_街道][CEND_X])作为CEND_X,
RTRIM([NSG_街道][CEND_Y])作为NSG_街道的CEND_Y
NSG_街道上的左侧外部连接特征。特征_UID=特征。特征_UID
NSG街道上的左侧外部连接特征类型。特征类型=特征类型。特征类型
左外连接NSG_街道上的SEC_用户。最后一次编辑用户\u UID=SEC_用户。用户\u UID
NSG街道上的左外连接LKP\U记录类型。记录类型\U UID=LKP\U记录类型。记录类型\U UID
左外连接NSG_街道上的LKP_街道_州。街道_州_UID=LKP_街道_州。街道_州_UID
左外连接NSG_STREETS上的LKP_STREET_曲面。STREET_曲面_UID=LKP_STREET_曲面。STREET_曲面_UID
左外连接NSG_街道上的LKP_权限。权限_UID=LKP_权限。权限_UID
左外连接NSG_街道上的NSG_县。COUNTY_UID=NSG_县。COUNTY_UID
左外连接NSG_街道上的NSG_街道分类。街道分类\u UID=NSG_街道分类。街道分类\u UID
哪里
([NSG_STREETS].[SHAPE_GEOMETRY].STIntersects(GEOMETRY::StGeometryFromText(@p1,0).MakeValid())>0)和
([NSG_STREETS].[SHAPE_GEOGRAPHY].STGeometryType()=“点”)'
EXEC@err=sp_executesql@stm,N'@p1 nvarchar(100)',@p1
如果@err 0开始
打印“错误”
返回@err
终止
终止

'dbo.['+@n+']AS'
应该是
n'dbo.+QUOTENAME(@n)+n'AS'
。否则,这只是一个有待利用的注入问题。谢谢,@Larnu,注入问题总是很重要的。在动态SQL中使用格式使其可读性与格式化非动态SQL一样重要。您有一个答案可以告诉您正确的操作方法。但是,如果您只是选择生成的字符串作为调试输出,那么代码的问题就显而易见了。然后,您会注意到,您只是在查询中嵌入了参数的名称,而您想要嵌入字符串中包含的值。如果你想写动态sql,你必须能够看到生成的代码来调试它,而且你需要一个存储过程来创建一个非常非常特定的视图,这是非常奇怪的。更重要的是,sql server 2008现在完全不受支持;应该有人对此表示关注。抱歉,我忘记了几周前我们更新了sql server 2014。这也不是我的代码,而是其他人的,我只是想修复这个bug。我不明白为什么你需要一次又一次地像这样生成一个视图。为什么不让一个过程接收@p1或一个视图,并在从中选择时使用where子句呢?生成同一事物的一个又一个视图,对where谓词只做一点小小的更改,这表明存在设计问题。