#sql #sql-server-2005 #tsql #stored-procedures
#sql #sql-server-2005 #tsql #хранимые процедуры
Вопрос:
Как бы вы реализовали эту проверку? У вас есть N параметров для хранимой процедуры.
Если все значения равны нулю, или 0, или пустой строке, запустите код, иначе пропустите его
Вот как я это реализовал, есть ли способ лучше?
Мне действительно не нравится то, что я сделал, поэтому я открыт для любой идеи получше, должно быть легко обслуживаемым, поскольку это было бы сделано во многих местах
declare @doRunIt bit
declare @checkAllNull varchar(max)
declare @sumOfInt int
set @checkAllNull = ''
set @checkAllNull = @checkAllNull coalesce(@param1,'')
set @checkAllNull = @checkAllNull coalesce(@param2,'')
set @checkAllNull = @checkAllNull coalesce(@param3,'')
set @checkAllNull = @checkAllNull coalesce(@param4,'')
set @checkAllNull = @checkAllNull coalesce(@param5,'')
set @checkAllNull = @checkAllNull coalesce(@param6,'')
set @sumOfInt = coalesce(@param7,0) coalesce(@param8,0)
coalesce(@param9,0) coalesce(@param10,0)
coalesce(@param11,0) coalesce(@param12,0)
set @checkAllNull = @checkAllNull cast(@sumOfInt as varchar(max))
if ( isnumeric(@checkAllNull)=1 )
if (cast(@checkAllNull as int) > 0)
set @doRunIt = 1
else
set @doRunIt = 0
else
if (ltrim(rtrim(@checkAllNull)) <> '')
set @doRunIt = 1
else
set @doRunIt = 0
Конечная цель — перенести проверку, выполненную в коде для вставки пустой строки, если все параметры равны нулю или используют значение по умолчанию, из базы данных в хранимую процедуру, чтобы другие приложения могли вызывать ту же хранимую процедуру без необходимости иметь дело с проверкой пустой строки.
Комментарии:
1. Возможно, вы идете в этом направлении не в ту сторону. Поскольку вы заявили, что решение «должно быть легко обслуживаемым, поскольку это будет выполняться во многих местах», я предполагаю, что вы считаете, что существует фундаментальная проблема с базой данных. Поскольку это кажется мне необычным запросом, я думаю, что может быть лучший / совершенно другой способ справиться с вашей проблемой. Что вы на самом деле пытаетесь сделать и почему?
2. @Scott Bruns, я обновил свой вопрос
3. Я предполагаю, что вам не нужно справляться, например, с
@param7
= 19,@param11
= -19 (которые вместе с другими параметрами int все равно будут равны нулю).4. Фредоу, как часто приложения вызывают хранимую процедуру со всеми параметрами, установленными в null / defaults? Я могу вспомнить только одно приложение, над которым я работал, у которого был запрос, который выполнялся плохо, если были переданы все значения null / defaults. Такова природа большинства ваших запросов? На данный момент мне в основном просто любопытно узнать о чем-то другом.
5. @Scott Bruns, не вдаваясь в подробности, в настоящее время у нас есть экран, который может принимать множество различных видов информации, каждый вид информации сгруппирован во множество текстовых полей / combobox / etc, И каждая группа получила storeproc. прямо сейчас, даже если в группе ничего нет, storeproc будет вызван при действии сохранения, которое вызовет вставку со всем значением null или значением по умолчанию. прямо сейчас код не может быть изменен, но sql (storeproc) может.
Ответ №1:
Ваш код
DECLARE @IsValid BIT = dbo.IsValidParameter(@param1) amp;
dbo.IsValidParameter(@param2) amp;
dbo.IsValidParameter(@param3) amp;
dbo.IsValidParameter(@param4)
Вспомогательная функция
CREATE FUNCTION dbo.IsValidParameter(@p1 Sql_Variant)
RETURNS bit
AS
BEGIN
IF @p1 IS NULL OR @p1 = '' OR @p1 = 0
RETURN 0
RETURN 1
END
GO
Комментарии:
1. к сожалению, по неизвестной причине любой UDF в используемом нами кластере sql имеет какую-то странную проблему, из-за которой он может зависать на несколько секунд, потребляя весь процессор и блокируя кластер.
2. @Fredou поместите это в SP, чем или исправьте ваш сервер 🙂
3. мне бы действительно очень понравился второй вариант, но у меня нет информации или контроля над ними
4. Фреду, ты действительно пробовал это решение? Может быть, вам повезет, и по какой-то причине это сработает.