powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Элементарный запрос помогите чайнику.
17 сообщений из 17, страница 1 из 1
Элементарный запрос помогите чайнику.
    #39568158
mtv_72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не работаю с SQL Server, поэтому прошу снисхождения. :)
Встала производственная необходимость сделать хранимку к сторонней БД.
И прошу пояснить почему происходит следующая ситуация.
Пример.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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) так же не работает.
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568172
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mtv_72,

Вы уверены, что работаете с Microsoft SQL Server? Это не его ситаксис.
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568177
mtv_72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я работаю в среде pl/sql по линку с БД sql Server.
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568184
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mtv_72Я работаю в среде pl/sql по линку с БД sql Server.На каком сервере выполняется нарисованный вами запрос?
На MSSQL? А почему тогда пишете на PL/SQL?
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568207
mtv_72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так как БД сторонняя и хронимку могу создать только в своей БД, а у меня Oracle и работаю я с pl/sql. в developere. Я понимаю, что о из неявного преобразования типов, но почему тогда берет число без кавычек если поле nvarchar.
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568229
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mtv_72,
еще раз - к MS SQL ваш вопрос не имеет ни малейшего отношения. Все проблемы на стороне Оракла и вопрос по нему надо задавать в соответствующем форуме.
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568253
mtv_72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если не сложно поделитесь кодом. Как мне сделать следующее. На стороне MSSQL желательно в хранимой процедуре. Так как акция не разовая.
На вход поступает строка "22,25,564" величина большая и переменная. К примеру пусть будет varchar(4000).
Нужно разбить по "," и найти для каждого номера во вх. строке пока она не кончится, думаю while.
Код: plsql
1.
num=22 

и так далее.
в таблице например 1 по каждому из полученных номеров в поле field1 типа nvarchar строку со значением val1
Код: plsql
1.
select val1 from tabl1 where field1=num



в таблице 2 int поле field2 в строке соответствующей условию по значению из предыдущего селекта.
Код: plsql
1.
update tabl2 set field3 = 1 where  field2=val1
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568258
KnyazewSergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mtv_72,

Код: sql
1.
2.
update tabl2 set tabl2.field3 = 1 
from tabl1 where tabl2.field2 = tabl1.val1 and tabl1.field1 = num
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568264
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mtv_72,

поиск
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568269
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
DECLARE @num VARCHAR(4000)='22,25,564';
SELECT * FROM tabl1 WHERE ','+@num+',' LIKE '%,'+field1+',%';
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568270
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
Код: sql
1.
2.
DECLARE @num VARCHAR(4000)='22,25,564';
SELECT * FROM tabl1 WHERE ','+@num+',' LIKE '%,'+field1+',%';

Поправка:
Код: sql
1.
2.
DECLARE @num VARCHAR(4000)='22,25,564';
SELECT * FROM tabl1 WHERE ','+@num+',' LIKE '%,'+CAST(field1 AS VARCHAR(4000))+',%';
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568291
mtv_72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот я вымучила мою первую попытку написать под mssql
посмотрите пож. все ли верно и как мне правильно while поставить?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
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
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568302
mtv_72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот я цикл поставила. Чет страшно запускать. ))))
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
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
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568309
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нужны тут никакие циклы.
Два UPDATEа, и всё!
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568393
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mtv_72,

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

Ну, ладно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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;
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568398
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mtv_72,

авторВот я цикл поставила. Чет страшно запускать. ))))
не страшно, он никогда ничего делать не будет
...
Рейтинг: 0 / 0
Элементарный запрос помогите чайнику.
    #39568625
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapmtv_72,

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

Ну, ладно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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] с неверными данными.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Элементарный запрос помогите чайнику.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]