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

Откуда: Сургут
Сообщений: 71
Я не работаю с SQL Server, поэтому прошу снисхождения. :)
Встала производственная необходимость сделать хранимку к сторонней БД.
И прошу пояснить почему происходит следующая ситуация.
Пример.

num number;
num:=22;
begin

select "CardNum", "CardID" 
into CNum,CId
from dbo.Card@WinBD
where "CardNum" = 22;

end; 

Если в запросе стоит 22 причем без кавычек все работает. Если вместо 22 я ставлю переменную описанную выше num, то не работает. Вопрос почему?
Поле nvarchar(30).
Тип для 22 задавала nvarchar(30) так же не работает.
12 дек 17, 10:55    [21026197]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7752
mtv_72,

Вы уверены, что работаете с Microsoft SQL Server? Это не его ситаксис.
12 дек 17, 11:06    [21026249]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
mtv_72
Member

Откуда: Сургут
Сообщений: 71
Я работаю в среде pl/sql по линку с БД sql Server.
12 дек 17, 11:09    [21026260]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
mtv_72
Я работаю в среде pl/sql по линку с БД sql Server.
На каком сервере выполняется нарисованный вами запрос?
На MSSQL? А почему тогда пишете на PL/SQL?
12 дек 17, 11:14    [21026282]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
mtv_72
Member

Откуда: Сургут
Сообщений: 71
так как БД сторонняя и хронимку могу создать только в своей БД, а у меня Oracle и работаю я с pl/sql. в developere. Я понимаю, что о из неявного преобразования типов, но почему тогда берет число без кавычек если поле nvarchar.
12 дек 17, 11:33    [21026388]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1526
mtv_72,
еще раз - к MS SQL ваш вопрос не имеет ни малейшего отношения. Все проблемы на стороне Оракла и вопрос по нему надо задавать в соответствующем форуме.
12 дек 17, 12:00    [21026565]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
mtv_72
Member

Откуда: Сургут
Сообщений: 71
Если не сложно поделитесь кодом. Как мне сделать следующее. На стороне MSSQL желательно в хранимой процедуре. Так как акция не разовая.
На вход поступает строка "22,25,564" величина большая и переменная. К примеру пусть будет varchar(4000).
Нужно разбить по "," и найти для каждого номера во вх. строке пока она не кончится, думаю while.
num=22 
и так далее.
в таблице например 1 по каждому из полученных номеров в поле field1 типа nvarchar строку со значением val1
select val1 from tabl1 where field1=num


в таблице 2 int поле field2 в строке соответствующей условию по значению из предыдущего селекта.
update tabl2 set field3 = 1 where  field2=val1
12 дек 17, 12:40    [21026792]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
KnyazewSergey
Member

Откуда:
Сообщений: 96
mtv_72,

update tabl2 set tabl2.field3 = 1 
from tabl1 where tabl2.field2 = tabl1.val1 and tabl1.field1 = num
12 дек 17, 12:52    [21026837]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
iiyama
Member

Откуда:
Сообщений: 642
mtv_72,

поиск
12 дек 17, 12:54    [21026850]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
DECLARE @num VARCHAR(4000)='22,25,564';
SELECT * FROM tabl1 WHERE ','+@num+',' LIKE '%,'+field1+',%';
12 дек 17, 12:58    [21026869]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
iap
DECLARE @num VARCHAR(4000)='22,25,564';
SELECT * FROM tabl1 WHERE ','+@num+',' LIKE '%,'+field1+',%';
Поправка:
DECLARE @num VARCHAR(4000)='22,25,564';
SELECT * FROM tabl1 WHERE ','+@num+',' LIKE '%,'+CAST(field1 AS VARCHAR(4000))+',%';
12 дек 17, 12:59    [21026877]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
mtv_72
Member

Откуда: Сургут
Сообщений: 71
Вот я вымучила мою первую попытку написать под mssql
посмотрите пож. все ли верно и как мне правильно while поставить?
USE [WIN-PAK PRO]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:          <Author,,Name>

-- Create date: <Create Date,,>

-- Description:     <Description,,>

-- =============================================

CREATE PROCEDURE [dbo].[DelCard]

       -- Add the parameters for the stored procedure here

       @listNum varchar(4000)

AS

declare @codCard int
declare @cardNum nvarchar(30)

declare @nn int= 0

declare @all int

declare @val nvarchar(30)

declare @base nvarchar(4000)=@listNum;

 

BEGIN

       -- SET NOCOUNT ON added to prevent extra result sets from

       -- interfering with SELECT statements.

       SET NOCOUNT ON;

где-то здесь надо цикл по проверки входящей строки 

       select @nn  =  charindex(',',@base);

       select @all = len(@base);  

    select @val = substring(@base, 1, @nn - 1);

    select @base =substring(@base, @nn + 1, @all - @nn);

 

    select @cardNum= [CardNumber],@codCard= [CardHolderID]   

      from [dbo].[Card]

     where [CardNumber] = @val

       if @codCard is not null

       begin try

       begin tran

        update [dbo].[Card] set [Deleted]=1 where [CardNumber]=@cardNum

            update [dbo].CardHolder set [Deleted]=1 where [RecordID]=@codCard

               commit tran

               end try

               begin catch      

              rollback tran

           end catch      

END
12 дек 17, 13:22    [21027009]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
mtv_72
Member

Откуда: Сургут
Сообщений: 71
Вот я цикл поставила. Чет страшно запускать. ))))
USE [WIN-PAK PRO]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:          <Author,,Name>

-- Create date: <Create Date,,>

-- Description:     <Description,,>

-- =============================================

CREATE PROCEDURE [dbo].[DelCard]

       -- Add the parameters for the stored procedure here

       @listNum varchar(4000)

AS

declare @codCard int

declare @cardNum nvarchar(30)

declare @nn int= 0

declare @all int

declare @val nvarchar(30)

declare @base nvarchar(4000)=@listNum;

 

BEGIN

       -- SET NOCOUNT ON added to prevent extra result sets from

       -- interfering with SELECT statements.

       SET NOCOUNT ON;

       while @all >0

       begin

             select @nn  =  charindex(',',@base);

             select @all = len(@base);  

             select @val = substring(@base, 1, @nn - 1);

             select @base =substring(@base, @nn + 1, @all - @nn);

 

             select @cardNum= [CardNumber],@codCard= [CardHolderID]   

               from [dbo].[Card]

             where [CardNumber] = @val

             if @codCard is not null

             begin try

             begin tran

             update [dbo].[Card] set [Deleted]=1 where [CardNumber]=@cardNum

                    update [dbo].CardHolder set [Deleted]=1 where [RecordID]=@codCard

                 commit tran

             end try

             begin catch

                    rollback tran

             end catch  

     end

END
12 дек 17, 13:30    [21027076]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Не нужны тут никакие циклы.
Два UPDATEа, и всё!
12 дек 17, 13:37    [21027136]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
mtv_72,

кстати, а чему у вас равно @all в while @all >0 ??

Ну, ладно.
DECLARE @CardHolder TABLE([RecordID] INT);

SET XACT_ABORT ON;
BEGIN TRANSACTION;

UPDATE [dbo].[Card]
SET [Deleted]=1
OUTPUT [CardHolderID] INTO @CardHolder([RecordID])
WHERE ','+@listNum+',' LIKE '%,'+[CardNumber]+',%';

UPDATE [dbo].[CardHolder]
SET [Deleted]=1
WHERE [RecordID] IN(SELECT [RecordID] FROM @CardHolder);

COMMIT TRANSACTION;
12 дек 17, 15:33    [21027587]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
mtv_72,

автор
Вот я цикл поставила. Чет страшно запускать. ))))

не страшно, он никогда ничего делать не будет
12 дек 17, 15:36    [21027602]     Ответить | Цитировать Сообщить модератору
 Re: Элементарный запрос помогите чайнику.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
iap
mtv_72,

кстати, а чему у вас равно @all в while @all >0 ??

Ну, ладно.
DECLARE @CardHolder TABLE([RecordID] INT);

SET XACT_ABORT ON;
BEGIN TRANSACTION;

UPDATE [dbo].[Card]
SET [Deleted]=1
OUTPUT [CardHolderID] INTO @CardHolder([RecordID])
WHERE ','+@listNum+',' LIKE '%,'+[CardNumber]+',%';

UPDATE [dbo].[CardHolder]
SET [Deleted]=1
WHERE [RecordID] IN(SELECT [RecordID] FROM @CardHolder);

COMMIT TRANSACTION;
Более правильно, конечно, сделать триггер на таблице [dbo].[Card] FOR UPDATE,
в котором апдейтить [dbo].[CardHolder] на основе deleted и inserted.
Потому что иначе очень просто выполнить UPDATE [dbo].[Card] без всякой вашей процедуры и оставить [dbo].[CardHolder] с неверными данными.
12 дек 17, 19:37    [21028547]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить