Вставить оператор с условным целевым столбцом - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь сохранить данные датчика, записанные в соответствующем целевом столбце, в зависимости от того, какие последние настройки находятся в таблице настроек (обозначается как @Unit в коде). Код, который у меня есть, дает мне синтаксическую ошибку в строке 19 рядом с «Time», но я не уверен, почему. Есть идеи?

CREATE PROCEDURE StoreTemp

@Temperature float,
@Seconds int,
@SessionId int,
@DatasetId int

AS

DECLARE

@Unit varchar(20),
@TempCol varchar(20)

SELECT @Unit = RecordingUnit from ReadLastUnit

SELECT @TempCol = (case @Unit when 'Celsius' then 'Temperature_C' else 'Temperature_F' END)

INSERT INTO DATASET (@TempCol, Time)

VALUES (@Temperature, GETDATE())

GO

1 Ответ

2 голосов
/ 13 апреля 2020

Нельзя использовать переменную для указания имени столбца в операторе вставки. Имя столбца должно быть stati c.

. Вы можете использовать Dynami c SQL, однако в этом случае вы можете просто условно вставить значение в правильный столбец, используя выражение case следующим образом:

CREATE PROCEDURE StoreTemp
(
  @Temperature float
  , @Seconds int
  , @SessionId int
  , @DatasetId int
)
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @Unit varchar(20), @TempCol varchar(20);

  SELECT @Unit = RecordingUnit from ReadLastUnit;

  --SELECT @TempCol = (case @Unit when 'Celsius' then 'Temperature_C' else 'Temperature_F' END);

  INSERT INTO DATASET (Temperature_C, Temperature_F, [Time])
    SELECT
      CASE WHEN @Unit = 'Celsius' THEN @Temperature ELSE NULL END
      , CASE WHEN @Unit != 'Celsius' THEN @Temperature ELSE NULL END
      , GETDATE();
END
GO

Для повышения производительности и более точного запроса, вы можете даже упростить insert, чтобы сделать все это, например,

INSERT INTO DATASET (Temperature_C, Temperature_F, [Time])
  SELECT
    CASE WHEN RecordingUnit = 'Celsius' THEN @Temperature ELSE NULL END
    , CASE WHEN RecordingUnit != 'Celsius' THEN @Temperature ELSE NULL END
    , GETDATE()
  from ReadLastUnit;

То есть, если вы всегда можете гарантировать одну строку в ReadLastUnit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...