SQL uniqueidentifier несовместим с float

#sql #sqldatatypes

#sql #sqldatatypes

Вопрос:

Я как-то застрял с этим сообщением об ошибке в моем небольшом запросе

Сообщение 206, уровень 16, состояние 2, строка 37 Столкновение типов операндов: uniqueidentifier несовместим с float

Я уже пытался установить uniqueidentifier для значений, которые являются uniqueidentifier в их таблицах

Или установите значения в импорте равными 0, чтобы дополнительно определить проблему, но мне не повезло.

     USE [master];

    if OBJECT_ID('tempdb.dbo.powerdeviation') is not null
    BEGIN
     DROP TABLE tempdb.dbo.powerdeviation
    END


    DECLARE @factor decimal = '1,5' /*   delete VALUE in workflow */
    DECLARE @item nvarchar(256) = '450294'  /*delete Value in workflow */
    DECLARE @item2 nvarchar(256) = '450295' /*delete Value in workflow */


    CREATE TABLE tempdb.dbo.powerdeviation(
    DeviceName nvarchar(256),
    DeviceTypeName nvarchar(256),
    TableID varchar(50),
    SiteLocation varchar(50),
    SiteName varchar(50),
    DeviceID uniqueidentifier,
    DeviceSerial nvarchar(256),
    TableName nvarchar(256),
    Factor decimal,
    tPowerColumn varchar(50),
    tPower float,
    t2DeviceSerial varchar(50),
    t2DeviceID float,
    t2PowerColumn varchar(50),
    t2Power float,
    t2Powerdeviation float,
    SitePower float,
    SitePowerDeviation float,
    typePower float,
    typePowerDeviation float
    );

    With cteTurbine1 as
    (   SELECT D.Name as Devicename, DT.Name as Devicetypename, LD.ID as TableID, S.Location, S.Name AS LocationName, D.ID AS DeviceID, D.SerialNumber AS DeviceSerial, LD.Name AS TableName, LC.Name AS PowerColumn
FROM CompMainConfig.dbo.DeviceType DT
JOIN CompMainConfig.dbo.Device D ON DT.ID = D.DeviceTypeID
JOIN CompMainConfig.dbo.LogTableDefinition LD ON LD.ID = DT.LogTableID
JOIN CompMainConfig.dbo.Site S ON D.SiteID = S.ID
JOIN CompMainConfig.dbo.LogColumnDefinition LC ON LC.TableID = DT.LogTableID
JOIN CompMainConfig..Resource R ON LC.LocalizedNameID = R.ResourceID
WHERE D.SerialNumber = (@item) and R.CultureName = 'en' and LC.MeasureFamily = '1' and LC.MeasureType = '1'  and LC.OrdinalIndex = '0'
    ),
    cteTurbine2 as
    (   SELECT D.Name as Devicename, DT.Name as Devicetypename, LD.ID as TableID, S.Location, S.Name AS LocationName, D.ID AS DeviceID, D.SerialNumber AS DeviceSerial, LD.Name AS TableName, LC.Name AS PowerColumn
FROM CompMainConfig.dbo.Device D
JOIN CompMainConfig.dbo.DeviceType DT ON D.DeviceTypeID = DT.ID 
JOIN CompMainConfig.dbo.LogTableDefinition LD ON LD.ID = DT.LogTableID
JOIN CompMainConfig.dbo.Site S ON D.SiteID = S.ID
JOIN CompMainConfig.dbo.LogColumnDefinition LC ON LC.TableID = DT.LogTableID
JOIN CompMainConfig..Resource R ON LC.LocalizedNameID = R.ResourceID
WHERE D.SerialNumber = (@item) and R.CultureName = 'en' and LC.MeasureFamily = '1' and LC.MeasureType = '1'  and LC.OrdinalIndex = '0'
    )

    INSERT INTO tempdb.dbo.powerdeviation
    SELECT cteTurbine1.Devicename, cteTurbine1.Devicetypename, cteTurbine1.TableID,         cteTurbine1.Location, cteTurbine1.LocationName, cteTurbine1.DeviceID, cteTurbine1.DeviceSerial, cteTurbine1.TableName, @factor, cteTurbine1.PowerColumn,0, cteturbine2.DeviceSerial ,cteturbine2.DeviceID, cteTurbine2.PowerColumn, 0,0,0,0,0,0
    FROM cteturbine1, cteturbine2
  

Ответ №1:

Вы можете выполнить одно из следующих действий:

Вариант 1: В определении таблицы измените столбец Device_ID на DeviceID uniqueidentifier ПО УМОЛЧАНИЮ NEWID() При этом вам не нужно указывать значение Device_ID во время вставки. Он автоматически использует функцию NEWID() и генерирует новый идентификатор GUID.

Вариант 2: Во время вставки данных вы можете вызвать, как показано ниже, чтобы получить новый идентификатор GUID для вашего Device_ID.

 INSERT INTO <table> VALUES (....., NEWID() as Device_ID....)