TABLESAMPLE 或 REPEATABLE 子句中不允许使用 Tablesample 变量

问题描述 投票:0回答:1

我有这个存储过程

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 sql-server stored-procedures
1个回答
0
投票

您需要使用动态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;
© www.soinside.com 2019 - 2024. All rights reserved.