Ошибка преобразования при преобразовании значения varchar '' в тип данных Bit - PullRequest
0 голосов
/ 23 апреля 2020

Я проверяю свой оператор вставки:

insert into Gebruiker
values ('Sonja123', 'Sonja', 'Van der Vliet', 'kastanjelaan 45',NULL, '3771jx', 'Heteren', 'Nederland', '1980-04-01','Pdel42@hotmail.com', 'WEBM1MAMV', 1, 'Poekie', 'wel')

Но каждый раз, когда я пытаюсь проверить его, я получаю сообщение об ошибке:

Преобразование не удалось при преобразовании значения varchar ' Wel 'к типу данных Бит.

Мой триггер:

CREATE TRIGGER TR_CHECKVERKOPER
   ON  Gebruiker
   FOR INSERT
AS 
BEGIN
    DECLARE @USER_NAME VARCHAR(70)
    SET @USER_NAME = (SELECT gebruikersnaam FROM INSERTED)

    IF (SELECT Verkoper FROM Gebruiker WHERE gebruikersnaam = @USER_NAME) = 'wel'
    BEGIN
        IF (SELECT COUNT(*) FROM Verkoper WHERE Gebruiker = @USER_NAME) = 0
        BEGIN
            UPDATE Gebruiker SET Verkoper = 'niet' WHERE gebruikersnaam = @USER_NAME    
        END
    END
END
GO

Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Преобразование varchar в бит не зависит от языка. Он запрограммирован только на то, что «истина» и «ложь» могут быть преобразованы.

Строковые значения TRUE и FALSE могут быть преобразованы в битовые значения: TRUE преобразуется в 1, а FALSE преобразуется в 0.

бит (Transact- SQL)

1 голос
/ 23 апреля 2020

Чтобы получить ошибку, вы получаете столбец Verkoper должен иметь тип bit. Как это исправить, зависит от общего дизайна, либо измените тип данных, либо используйте правильный столбец. Это тривиально.

Однако я отвечаю на вопрос, потому что ваш триггер в настоящее время не обрабатывает тот факт, что псевдотаблица Inserted может содержать несколько строк.

Вы должны всегда пытаться решить проблемы T- SQL как проблемы на основе множеств, а не процедурные проблемы - потому что реляционные базы данных оптимизированы для операций на множествах.

Я думаю, что следующий оператор update выполняет ту же функцию, что и код, который вы опубликовали, но, если нет, надеюсь, вы поймете идею и сможете ее адаптировать.

UPDATE Gebruiker SET
  Verkoper = 'niet'
WHERE gebruikersnaam in (SELECT gebruikersnaam FROM INSERTED)
and (SELECT COUNT(*) FROM Verkoper V WHERE V.Gebruiker = gebruikersnaam) = 0
and Verkoper = 'wel';

Фактически (спасибо Дэвиду), заменив слова 'niet' и 'wel' значениями битов 0 и 1 может быть решение, которое вы ищете:

UPDATE Gebruiker SET
  Verkoper = 0
WHERE gebruikersnaam in (SELECT gebruikersnaam FROM INSERTED)
and (SELECT COUNT(*) FROM Verkoper V WHERE V.Gebruiker = gebruikersnaam) = 0
and Verkoper = 1;

Вы должны изменить свой оператор insert, чтобы также использовать 0 или 1 для Verkoper.

Примечание. перечислить имена столбцов для вашей вставки. Это не только означает, что вы можете добавлять столбцы позже, не прерывая вставку, но и делает очевидным для людей, не знакомых с вашей схемой, в какой столбец вставляется каждое значение.

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