我有这个存储过程
ALTER PROCEDURE [dbo].[usp_HistoryDataSensor]
@EquipmentID int,
@tanggalfrom datetime,
@tanggalto datetime,
@shiftfrom int,
@shiftto int,
@sensorid int,
@percent int
AS
BEGIN
DECLARE @datefrom datetime,
@dateto datetime,
@tPercent int
SET @tPercent = @percent
SELECT @datefrom = (SELECT StartTime FROM dbo.ufn_ShiftDateTime(@tanggalfrom, @shiftfrom)),
@dateto = (SELECT EndTime FROM dbo.ufn_ShiftDateTime(@tanggalto, @shiftto))
-- SELAIN SENSOR SPEED
IF @sensorid <> -99
BEGIN
SELECT
ss.dtCreatedAt AS [DateTime],
ss.flSensorValues AS [Value]
FROM
tabShiftSensor AS ss
TABLESAMPLE (@tPercent PERCENT) WITH (NOLOCK)
WHERE
ss.EquipmentID = @EquipmentID
AND ss.SensorDefID = @sensorid
AND ss.dtCreatedAt BETWEEN @datefrom AND @dateto
ORDER BY
ss.dtCreatedAt
END
ELSE -- SENSOR SPEED
BEGIN
SELECT
ss.dtCreatedAt AS [DateTime],
ss.flSpeed AS [Value]
FROM
tabShiftSensor AS ss
TABLESAMPLE (@tPercent PERCENT) WITH (NOLOCK)
WHERE
ss.EquipmentID = @EquipmentID
AND ss.dtCreatedAt BETWEEN @datefrom AND @dateto
ORDER BY
ss.dtCreatedAt
END
END
当我执行存储过程时,出现错误:
程序 usp_HistoryDataSensor,第 28 行 [批量起始行 0]
TABLESAMPLE 或 REPEATABLE 子句中不允许使用变量。
如何将变量百分比放入表样本中,以便我可以设置表样本的百分比?
谢谢
您需要使用动态SQL来注入百分比。这也将简化
IF...ELSE...
。
注意其余参数应正确传递,而不是注入。
CREATE OR ALTER PROCEDURE [dbo].[usp_HistoryDataSensor]
@EquipmentID int,
@tanggalfrom datetime,
@tanggalto datetime,
@shiftfrom int,
@shiftto int,
@sensorid int = -99,
@percent int
AS
SET NOCOUNT ON;
DECLARE @datefrom datetime,
@dateto datetime
SET @datefrom = (SELECT StartTime FROM dbo.ufn_ShiftDateTime(@tanggalfrom, @shiftfrom)),
@dateto = (SELECT EndTime FROM dbo.ufn_ShiftDateTime(@tanggalto, @shiftto))
DECLARE @sql nvarchar(max) = N'
SELECT
ss.dtCreatedAt AS DateTime,
ss.' + IIF(@sensorid <> -99, N'flSensorValues', N'flSpeed') + N' AS Value
FROM
tabShiftSensor AS ss
TABLESAMPLE (' + CAST(@percent AS nvarchar(12)) + ' PERCENT)
WHERE
ss.EquipmentID = @EquipmentID
' + IIF(@sensorid <> -99, N'AND ss.SensorDefID = @sensorid
', N'') + N'
AND ss.dtCreatedAt BETWEEN @datefrom AND @dateto
ORDER BY
ss.dtCreatedAt;
';
EXEC sp_executesql @sql,
N'@datefrom datetime,
@dateto datetime,
@sensorid int,
@EquipmentID int',
@datefrom = @datefrom,
@dateto = @dateto,
@sensorid = @sensorid,
@EquipmentID = @EquipmentID;