jateshs9 Ответов: 2

Как сделать мой запрос более точным на основе моего условия для возврата строки


Я создаю строковую функцию, которая проверяет дублирующуюся запись перед вставкой или обновлением записи, но у меня есть условие с ней. Прежде чем давать условия, у меня есть таблица под названием Products (name, description, type, isenabled, InsertedDate, UpdatedDate). Значение в тип данных бит (0 или 1). И InsertedDate, UpdatedDate генерируются автоматически.

В столбце isEnables

0-выключено
1 означает включить

Перед вставкой проверьте, является ли имя уникальным, но если имя существует более одного, то,

Мое состояние

1. Проверьте, является ли продукт isEnabled = 1, затем при вставке данных должно появиться сообщение "продукт существует в таблице."
2. Проверьте, является ли продукт isEnabled = 0, затем при вставке данных должно появиться сообщение "продукт существует, но он отключен."
3. Еще вставить/обновить данные.


Ниже функция только проверяет, существует ли запись или нет, и соответственно возвращает сообщение.

Вопрос:
How can I have return proper message regardless I am checking above query for inserting or updating a record and it goes over my requirement. As Top 1 can help me to insert new record checking if name is unique and it will return empty but if I am updating row with its own keeping name as it is and changing other column which is  description. And when I update that I am receiving message "Record exist in the table" which it should not give me and should updating without message.  So how can I make this query check for both the method **inserting and updating** record. 


Что я уже пробовал:

private string GetName(string name, int id)
{
		using (var connection = connection string)
		using (var command = new SqlCommand())
		{
			command.Connection = connection;
			command.CommandText =
			@"DECLARE @Enabled INT; " +
			@"SET @Enabled = " +
			@"( " +
				@"SELECT TOP 2 p.isEnabled" +
				@"FROM dbo.[product] p WITH (nolock) " +
				@"WHERE p.name = @name " +
			@"); " +
			@"SELECT Msg = CONVERT( VARCHAR(32), " +
											 @"CASE " +
												 @"WHEN @Enabled = 0 " +
												 @"THEN 'Record is disabled' " +
												 @"WHEN @Enabled = 2 " +
												 @"THEN 'Record exist in the table' " +
												 @"ELSE ''";
											 @"END);";
			command.Parameters.AddWithValue("name", name);
			command.CommandTimeout = 100;
			connection.Open();
			command.ExecuteNonQuery();
			string message = (string)command.ExecuteScalar();
			connection.Close();
			return message;
		}
	}
	return string.Empty;
}

CHill60

Есть проблема с вашими условиями:
1. Если продукт уже существует в таблице, вы должны не" вставлять данные", а обновлять их.
2. то же самое относится и здесь - непонятно, почему вы хотите знать, отключен он или нет
3.Вы не можете обновить данные, если строка еще не существует, вы можете только вставить.

Можете ли вы уточнить, когда вы будете вставлять данные и когда вы будете их обновлять? Нет необходимости в топ-2, так как вы пытаетесь убедиться, что каждое [имя] уникально.

2 Ответов

Рейтинг:
1

Luis Velarde

Это не обязательно делать выбор для получения информации. Я вижу проблему, когда вы пытаетесь установить переменную @Enable. @Enable предназначен для уникального значения, но ваш select-это top 2, и это коллекция, по этой причине, если вы попытаетесь запустить скрипт, это выдаст вам сообщение об ошибке. вам нужно перейти на топ-1. В последнем случае у вас есть преобразование для Msg, но в вашем случае у вас есть все значения с типом string. В этом нет необходимости. Попробуйте выполнить следующий запрос:

SELECT TOP 1 
	CASE 
		WHEN p.is_active = 0 THEN 'Record is disabled'
		WHEN p.is_active = 2 THEN 'Record exist in the table'
		ELSE ''
	END  
FROM 
dbo.[product] p WITH (nolock)
WHERE p.name = @name)


Наконец, попробуйте использовать процедуры хранения в будущем, потому что это более безопасно и быстрее, чем текст команды. Удачи.


jateshs9

Вопрос: is_active переименовывается в isenabled, который имеет тип данных как бит в 0 или 1. Он никогда не будет таким 2, как в вашем коде. Я внес изменения, основываясь на моем предыдущем предложении.

1. Извините, что говорю так, но либо вы не поняли мой вопрос, либо вы не посмотрели на мое требование должным образом, так как ваш запрос неверен. Ваш запрос только проверяет, является ли isEnable равным 0 или 1. Но не существует ли имя более одного или нет.

2.я не получаю никакого сообщения об ошибке, я сам запустил его в SQL Server, и он работает для @Enable = 0, но в других случаях. Текст команды был похож на требование использовать вместо хранимой процедуры. Я полностью осознаю наличие хранимой процедуры, но я должен был сделать это таким образом.

3. Top 1 выберет только одну запись. Допустим, я обновляю название в строке 4 с "молочные продукты" на "приправы". Здесь "приправы" уже существуют в строке 2. Поэтому обновление не должно происходить и должно возвращать сообщение "запись существует в таблице." Это не будет сравниваться с другими строками для проверки. Если я обновляю строку 5 с самим изменением описания, она покажет мне сообщение "запись существует в таблице" и, таким образом, не позволит мне обновить саму строку.

Пожалуйста, смотрите изображение для примера приведем пункт 3.

Рейтинг:
1

Luis Velarde

Ладно думаю да что тебе нужно

Первый вариант:

--THE BEST OPTION IS USE A UNIIQUE IN THE FIELD OF YOUR TABLE
-- IF THIS EXISTS YOU CAN CATH THE ERROR AN RETURN THIS TO THE USER
CREATE TABLE Products(
	identifier int identity(1,1),
	name	varchar(50)
	UNIQUE (name) --<===THIS IS A CONFIGURATION THAT YOU NEED IN YOUR TABLE
)

INSERT INTO Products(name) VALUES('Product 1')
INSERT INTO Products(name) VALUES('Condiments')
INSERT INTO Products(name) VALUES('Product 3')
INSERT INTO Products(name) VALUES('Dairy Products')

SELECT * FROM Products

--WHEN YOU TRY TO MAKE AN UPDATE
UPDATE Products
SET name = 'Condiments'
WHERE identifier = 4

--THIS OPTION WORK TOO IN AN INSERT
INSERT INTO Products(name) VALUES('Condiments')

DROP TABLE Products


вторая возможность:

--THIS IS NOT THE BEST OPTION BECUASE YOU ARE NOT WORKING WITH THE RULES OF DB
--YOU ARE TRYING REPLACE THE FUNCTION OF DB IN CODE AND ONLY WORK IN THE QUERY
CREATE TABLE Products(
	identifier	INT IDENTITY(1,1),
	name		VARCHAR(50)
)
DECLARE @OLDname AS VARCHAR (50),
		@NEWname AS VARCHAR (50)
SET @OLDname = 'Dairy Products'
SET @NEWname = 'Condiments'

INSERT INTO Products(name) VALUES('Product 1')
INSERT INTO Products(name) VALUES('Condiments')
INSERT INTO Products(name) VALUES('Product 3')
INSERT INTO Products(name) VALUES('Dairy Products')



IF EXISTS(SELECT * FROM Products WHERE name = @NEWname)
BEGIN
	SELECT @NEWname + ' EXIST IN THE TABLE'
END
ELSE
BEGIN
	SELECT 'YOU CAN MAKE AN UPDATE FROM ' + @OLDname + ' TO ' + @NEWname
END

DROP TABLE Products