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.
并使用其他东西作为前缀,或者根本不使用前缀!