Sql server 消息102,级别15,状态1,第34行';附近的语法不正确';

Sql server 消息102,级别15,状态1,第34行';附近的语法不正确';,sql-server,Sql Server,我在执行以下查询时遇到上述错误,这是一个存储过程命令行执行 exec sp_Bind_Division_Store_Camera_On_Filter_In_Liveview null, null, null, null 存储过程如下所示 ALTER PROCEDURE [dbo].[sp_Bind_Division_Store_Camera_On_Filter_In_Liveview] @division varchar(45), @store varchar(45

我在执行以下查询时遇到上述错误,这是一个存储过程命令行执行

exec sp_Bind_Division_Store_Camera_On_Filter_In_Liveview 
     null, null, null, null
存储过程如下所示

ALTER PROCEDURE [dbo].[sp_Bind_Division_Store_Camera_On_Filter_In_Liveview]
    @division varchar(45),
    @store varchar(45),
    @camera varchar(68),
    @group varchar(100)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
        DECLARE 
            @BaseQuery nvarchar(max) =  'select 
                                            distinct tblcameradetails.name as CameraName,
                                            tblcameradetails.IsDeviceEnabled, 
                                            tblcameradetails.cameraID, 
                                            tblcameradetails.deviceIP, 
                                            tblmediasourcedetails.StreamName, 
                                            tblmediasourcedetails.streamID, 
                                            tblcameradetails.Model_ID, 
                                            tblcameradetails.IsHidden, 
                                            tblcameradetails.hasPTZcapability,
                                            tblcameradetails.CameraModelNo, 
                                            tblcameradetails.username as CameraUserName,
                                            tblcameradetails.hasPTZCycle,
                                            tblcameradetails.hasPreset, 
                                            tblcameradetails.password as CameraPassword, 
                                            tblmediasourcedetails.isRecordingStarted as IsRecordingOn, 
                                            tblcameradetails.IsCovert, 
                                            tblcameradetails.constCameraName, 
                                            tblmediasourcedetails.constStreamName,
                                            tblstoredetails.Store_ID,
                                            tblsystemlocationdetails.division,
                                            tblstoredetails.Store_Name,
                                            tblstoredetails.Store_IP,
                                            tblstoreconfiguration.Liveview_Session_Timeout  
                                        from 
                                            tblmediasourcedetails, 
                                            tblcameradetails, 
                                            tblcameragroupdetails, 
                                            tblgroupdetails, 
                                            tblvssaddsourcedetails,
                                            tblsystemlocationdetails,
                                            tblstoredetails,
                                            tblstoreconfiguration'

    ,   @ParamList nvarchar(max) = N'@p1 varchar(45), @p2 varchar(45), @p3 varchar(68), @p4 varchar(100)'
    ,   @WhereClause nvarchar(max) = N'where 
                                            tblmediasourcedetails.cameraID=tblcameradetails.cameraID 
                                            and tblmediasourcedetails.streamID=tblvssaddsourcedetails.streamID 
                                            and tblcameradetails.cameraID = tblcameragroupdetails.cameraID 
                                            and tblcameragroupdetails.groupID=tblgroupdetails.groupID
                                            and tblstoredetails.Store_ID= tblcameradetails.Store_ID
                                            and tblsystemlocationdetails.Store_ID= tblstoredetails.Store_ID
                                            and tblstoredetails.Store_ID=tblstoreconfiguration.Store_ID and 1=1'
    ,   @OrderByClause nvarchar(100) = 'order by CameraName';

        IF @division IS NOT NULL
        BEGIN
            SET @WhereClause = @WhereClause + ' and division like (@p1)';
        END

        IF @store IS NOT NULL
        BEGIN
            SET @WhereClause = @WhereClause + ' and (store like (@p2))';
        END

        IF @camera IS NOT NULL
        BEGIN
            SET @WhereClause = @WhereClause + ' and tblcameradetails.name like (@p3)';
        END

        IF @group IS NOT NULL
        BEGIN
            SET @WhereClause = @WhereClause + ' and tblgroupdetails.name in (@p4)';
        END

        SET @BaseQuery = @BaseQuery + @WhereClause + @OrderByClause;

        EXECUTE sp_executesql @BaseQuery, @ParamList, @p1 = @division, @p2 = @store, @p3 = @camera, @p4 = @group;

END

现在错误告诉我,在第34行,语法靠近“.”时出现了错误,但我没有发现任何问题,因为我运行的这个查询表单命令提示符与在存储过程中应用的一样好,它将引发错误。请帮我解决这个问题。

您可以轻松打印变量
@BaseQuery
来检查结果查询

变量
@BaseQuery
中的查询如下所示

select 
                                            distinct tblcameradetails.name as CameraName,
                                            tblcameradetails.IsDeviceEnabled, 
                                            tblcameradetails.cameraID, 
                                            tblcameradetails.deviceIP, 
                                            tblmediasourcedetails.StreamName, 
                                            tblmediasourcedetails.streamID, 
                                            tblcameradetails.Model_ID, 
                                            tblcameradetails.IsHidden, 
                                            tblcameradetails.hasPTZcapability,
                                            tblcameradetails.CameraModelNo, 
                                            tblcameradetails.username as CameraUserName,
                                            tblcameradetails.hasPTZCycle,
                                            tblcameradetails.hasPreset, 
                                            tblcameradetails.password as CameraPassword, 
                                            tblmediasourcedetails.isRecordingStarted as IsRecordingOn, 
                                            tblcameradetails.IsCovert, 
                                            tblcameradetails.constCameraName, 
                                            tblmediasourcedetails.constStreamName,
                                            tblstoredetails.Store_ID,
                                            tblsystemlocationdetails.division,
                                            tblstoredetails.Store_Name,
                                            tblstoredetails.Store_IP,
                                            tblstoreconfiguration.Liveview_Session_Timeout  
                                        from 
                                            tblmediasourcedetails, 
                                            tblcameradetails, 
                                            tblcameragroupdetails, 
                                            tblgroupdetails, 
                                            tblvssaddsourcedetails,
                                            tblsystemlocationdetails,
                                            tblstoredetails,
                                            tblstoreconfigurationwhere 
                                            tblmediasourcedetails.cameraID=tblcameradetails.cameraID 
                                            and tblmediasourcedetails.streamID=tblvssaddsourcedetails.streamID 
                                            and tblcameradetails.cameraID = tblcameragroupdetails.cameraID 
                                            and tblcameragroupdetails.groupID=tblgroupdetails.groupID
                                            and tblstoredetails.Store_ID= tblcameradetails.Store_ID
                                            and tblsystemlocationdetails.Store_ID= tblstoredetails.Store_ID
                                            and tblstoredetails.Store_ID=tblstoreconfiguration.Store_ID and 1=1order by CameraName
@WhereClause nvarchar(max) = N' where 
 @OrderByClause nvarchar(100) = ' order by CameraName';
您可以看到,
WHERE
orderby
子句前面缺少一个空格

您需要在
WHERE
ORDER BY
变量的开头添加一个空格,如下所示

select 
                                            distinct tblcameradetails.name as CameraName,
                                            tblcameradetails.IsDeviceEnabled, 
                                            tblcameradetails.cameraID, 
                                            tblcameradetails.deviceIP, 
                                            tblmediasourcedetails.StreamName, 
                                            tblmediasourcedetails.streamID, 
                                            tblcameradetails.Model_ID, 
                                            tblcameradetails.IsHidden, 
                                            tblcameradetails.hasPTZcapability,
                                            tblcameradetails.CameraModelNo, 
                                            tblcameradetails.username as CameraUserName,
                                            tblcameradetails.hasPTZCycle,
                                            tblcameradetails.hasPreset, 
                                            tblcameradetails.password as CameraPassword, 
                                            tblmediasourcedetails.isRecordingStarted as IsRecordingOn, 
                                            tblcameradetails.IsCovert, 
                                            tblcameradetails.constCameraName, 
                                            tblmediasourcedetails.constStreamName,
                                            tblstoredetails.Store_ID,
                                            tblsystemlocationdetails.division,
                                            tblstoredetails.Store_Name,
                                            tblstoredetails.Store_IP,
                                            tblstoreconfiguration.Liveview_Session_Timeout  
                                        from 
                                            tblmediasourcedetails, 
                                            tblcameradetails, 
                                            tblcameragroupdetails, 
                                            tblgroupdetails, 
                                            tblvssaddsourcedetails,
                                            tblsystemlocationdetails,
                                            tblstoredetails,
                                            tblstoreconfigurationwhere 
                                            tblmediasourcedetails.cameraID=tblcameradetails.cameraID 
                                            and tblmediasourcedetails.streamID=tblvssaddsourcedetails.streamID 
                                            and tblcameradetails.cameraID = tblcameragroupdetails.cameraID 
                                            and tblcameragroupdetails.groupID=tblgroupdetails.groupID
                                            and tblstoredetails.Store_ID= tblcameradetails.Store_ID
                                            and tblsystemlocationdetails.Store_ID= tblstoredetails.Store_ID
                                            and tblstoredetails.Store_ID=tblstoreconfiguration.Store_ID and 1=1order by CameraName
@WhereClause nvarchar(max) = N' where 
 @OrderByClause nvarchar(100) = ' order by CameraName';

试着在查询的中间放一些<代码>打印<代码>。< /P> 例如,在

SET@BaseQuery=@BaseQuery+@WhereClause+@OrderByClause之后
PRINT@BaseQuery


因为您可能需要在某个变量中使用空格(例如,
N'where…1=1'
而不是
N'where…1=1'

您是否打印了@BaseQuery以查看它的外观?旁注:您不应该在存储过程中使用
sp\
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!