Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Динамический SQL  [new]
NatRez
Member

Откуда:
Сообщений: 3
Динамический SQL
У меня есть БД. В ней есть несколько таблиц со словарем.
На таблицу codeCity
CityID (PK, identity, smallint, not null)
CityName (varchar(30), not null)
построила вот такую процедуру.

Create PROCEDURE [dbo].[up_i_u_codeCity]
(
@CityID smallint=null ,
@CityName varchar(max)=null)
AS
SET NOCOUNT ON

IF EXISTS (SELECT * FROM dbo.codeCity
WHERE LTRIM(RTRIM(CityName)) = LTRIM(RTRIM(@CityName)))
AND LTRIM(RTRIM(@CityName)) IS NOT NULL OR LEN(LTRIM(RTRIM(@CityName)))>20
BEGIN
IF LEN(LTRIM(RTRIM(@CityName)))>20
SELECT 'Length of city '+@CityName+ ' to long, not inserted.' as Not_allowad_length
ELSE
SELECT 'Duplicate values not allowed' as Duplication
END
ELSE

IF EXISTS (SELECT * FROM dbo.codeCity
WHERE CityID = @CityID ) --and isnumeric(@CityID)
AND LTRIM(RTRIM(@CityName)) IS NOT NULL
BEGIN

UPDATE dbo.codeCity
SET
CityName = @CityName
WHERE CityID = @CityID

SELECT 'City updated' as Successeful_update

END

ELSE
IF ISNULL(@CityName,'') = ''
BEGIN
SELECT 'No name introduced.' as Value_is_NULL
END
ELSE
BEGIN
INSERT INTO dbo.codeCity VALUES (LTRIM(RTRIM(@CityName)))
select 'City name inserted'
end



--exec up_i_u_codeCity
--exec up_i_u_codeCity '',' r jes2a '
--exec up_i_u_codeCity '9','jerjdkoghkusa'
--exec up_i_u_codeCity null,' 23fgh '


Как построить динамическую процедуру, что бы она проверила мою БД и на все однотипные таблицы (словари) построила такие же процедуры.
Например, на codeProfession, codeEducation
4 ноя 12, 21:22    [13420949]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
NatRez
все однотипные таблицы (словари)
и сколько их?
4 ноя 12, 21:35    [13420990]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
NatRez
Member

Откуда:
Сообщений: 3
8 штук
4 ноя 12, 21:52    [13421051]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
идея правильная код жуть
Guest
NatRez
8 штук

ctrl+c ctrl+v, replace.
4 ноя 12, 22:08    [13421096]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
NatRez
Member

Откуда:
Сообщений: 3
а как не жуть?
4 ноя 12, 22:27    [13421126]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
? можно убить топикстартера-автоматизатора вот за такое:
WHERE LTRIM(RTRIM(CityName)) = LTRIM(RTRIM(@CityName)))
 AND LTRIM(RTRIM(@CityName)) IS NOT NULL OR LEN(LTRIM(RTRIM(@CityName)))>20  


Уважаемый ТС, ваша процедура, возможно будет работать... Но на 8 случаев действительно проще ^c и ^v ... А вообще, пересмотрите немного текст вашей ХП... И условия хранения данных. Ну и это, LTRIM(RTRIM(@CityName)) IS NOT NULL смело переделайте в @CityName IS NOT NULL... И проверьте, правильно ли у Вас условия выполняются с учётом приоритетов AND и OR ...
5 ноя 12, 00:09    [13421393]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Creating Scripts Using Templates in SQL Server
5 ноя 12, 11:16    [13421896]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
NatRez
а как не жуть?
IF object_id('dbo.codeCity') IS NULL
BEGIN
  CREATE TABLE dbo.codeCity (
    CityID    SMALLINT IDENTITY,
    CityName  VARCHAR(20) NOT NULL,
    CONSTRAINT PK_codeCity PRIMARY KEY (CityID)     
  )
  
  CREATE UNIQUE INDEX X_codeCity_Name on dbo.codeCity (CityName)
END
GO

IF object_id( 'dbo.up_i_u_codeCity' ) IS NOT NULL
  DROP PROCEDURE dbo.up_i_u_codeCity
GO

CREATE PROCEDURE dbo.up_i_u_codeCity
  @CityID     SMALLINT OUTPUT,
  @CityName   VARCHAR(MAX)
AS
BEGIN
  SET NOCOUNT ON
  
  SET @CityName = LTRIM(RTRIM(@CityName))

  UPDATE codeCity
  SET    CityName = @CityName
         @CityID  = CityID
  WHERE  CityID   = @CityID
  
  IF @CityID IS NULL
  BEGIN
    INSERT INTO codeCity VALUES (@CityName)
    
    SET @CityID = SCOPE_IDENTITY()
  END
END	
5 ноя 12, 11:35    [13421950]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
если так хотелось
Guest
skyANA,

во-первых, лишний, никому не нужный холостой апдейт на вставке (который лечится продолжением того же if'а else'ом),
во-вторых, потеряна идея (хоть предложенная реализация и обязана быть потерянной) возвратов состояний - теперь нужно ловить системные ошибки.
5 ноя 12, 21:09    [13423660]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
если так хотелось
skyANA,

во-первых, лишний, никому не нужный холостой апдейт на вставке (который лечится продолжением того же if'а else'ом),
Какой такой лишний, холостой апдейт?
если так хотелось
во-вторых, потеряна идея (хоть предложенная реализация и обязана быть потерянной) возвратов состояний - теперь нужно ловить системные ошибки.
Не вижу смысла заменять встроенный механизм ограничений целостности на свой.
5 ноя 12, 22:20    [13423877]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
dalex1973
Member

Откуда: Польша
Сообщений: 287
Если версия SQL Server 2008 и выше, можно так:

CREATE PROCEDURE [dbo].[up_i_u_codeCity]
  @CityID     SMALLINT OUTPUT,
  @CityName   VARCHAR(MAX),
  @ActionType BIT
AS
BEGIN
SET @CityName = LTRIM(RTRIM(@CityName))
DECLARE @Table TABLE(ActionType NVARCHAR(10),CityID BIGINT)
MERGE codeCity AS T
USING (SELECT @CityID,@CityName) AS S(CityID,CityName) ON T.cityName = S.CityName
WHEN NOT MATCHED THEN INSERT (CityName)
	VALUES(CityName)
WHEN MATCHED THEN UPDATE SET T.CityName=S.CityName
	OUTPUT $Action,inserted.CityID INTO @Table;

SELECT @ActionType =
CASE T.ActionType
WHEN 'INSERT' THEN 1
WHEN 'UPDATE' THEN 0
END,
@CityID = t.CityID FROM @Table T

END


На выходе получаем @ActionType =1 для вставки и 0 дя обновления.
Преимущество - выборка записи из временной таблицы против выборки из таблицы постоянной.
6 ноя 12, 12:26    [13425663]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
во-вторых отк
Guest
skyANA
если так хотелось
skyANA,
во-первых, лишний, никому не нужный холостой апдейт на вставке (который лечится продолжением того же if'а else'ом),
Какой такой лишний, холостой апдейт?

помочь тебе в своем же коде разобраться?
skyANA
если так хотелось
во-вторых, потеряна идея (хоть предложенная реализация и обязана быть потерянной) возвратов состояний - теперь нужно ловить системные ошибки.
Не вижу смысла заменять встроенный механизм ограничений целостности на свой.

вариантов, во-первых, больше двух. во-вторых, отказываться от возврата состояний вроде как никто не заказывал.
6 ноя 12, 12:39    [13425769]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
во-вторых отк
skyANA
пропущено...
Какой такой лишний, холостой апдейт?

помочь тебе в своем же коде разобраться?
Ага... Объясни, почему он лишний и холостой? Если условие выполняется, то нужно обновить, то есть апдейт не лишний. Иначе апдейта просто не будет.
во-вторых отк
skyANA
пропущено...
Не вижу смысла заменять встроенный механизм ограничений целостности на свой.

вариантов, во-первых, больше двух. во-вторых, отказываться от возврата состояний вроде как никто не заказывал.
Повторю: лично я не вижу смысла заменять встроенный механизм ограничений целостности на возврат состояний. Что это даст?
6 ноя 12, 13:23    [13426199]     Ответить | Цитировать Сообщить модератору
 Re: Динамический SQL  [new]
втроенный мазохизм
Guest
skyANA
Иначе апдейта просто не будет.

да как это не будет?

skyANA
во-вторых отк
пропущено...

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

от "встроенных механизмов" отказываться не обязательно.
предложенный код потеряло большое количество изначально заложенных ТС смыслов (кривость кода не в счет), от crud'овых смыслов стал дальше чем код тс
6 ноя 12, 14:28    [13426668]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить