Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

выборка в MS SQL2000   Найти похожие ветки 

 
denmin ©   (2003-10-20 13:31) [0]

Здравствуйте.
Есть простой запрос в D5
SELECT First.Code, First.Name, Second.Name, Second.Code
FROM "First.DB" First
INNER JOIN ":DB1:Second.DB" Second
ON (First.Code = Second.Code)
т.е. связь двух таблиц по полям Code.
Так вот необходимо организовать такую связь в MS SQL2k. Желательно через хранимую процедуру????. А можно ли через ADODataset? Или вообще хоть как?


 
bushmen ©   (2003-10-20 13:35) [1]

SELECT First.Code, First.Name, Second.Name, Second.Code
FROM First INNER JOIN Second
ON (First.Code = Second.Code)


 
denmin ©   (2003-10-20 13:40) [2]

да забыл сказать, что таблицы в разных базах храняться. First в DB1, а Second в DB2. если можно,Ваш запрос написать, то где: в хранимой процедуре, или где?


 
bushmen ©   (2003-10-20 13:46) [3]

SELECT First.Code, First.Name, Second.Name, Second.Code
FROM db1..First First INNER JOIN db2..Second Second
ON (First.Code = Second.Code)

Можешь как угодно - и через AdoQuery, и через хранимую процедуру

ADOQuery1.Close;
ADOQuery1.SQL.CLEAR;
ADOQuery1.SQLADD("SELECT First.Code, First.Name, Second.Name, Second.Code FROM db1..First First INNER JOIN db2..Second Second
ON (First.Code = Second.Code)");
ADOQuery1.Open;

cerate proc1 as
begin
SELECT First.Code, First.Name, Second.Name, Second.Code FROM db1..First First INNER JOIN db2..Second Second
ON (First.Code = Second.Code)
end


 
denmin ©   (2003-10-20 14:50) [4]

извините, но я только начинаю, а в книге не написано. А что вместо двух точек ставить в FROM db1..First First?


 
bushmen ©   (2003-10-20 14:56) [5]

Ничего не надо туда ставить.


 
denmin ©   (2003-10-20 15:18) [6]

у меня вот так
CREATE PROCEDURE [dbo].[select_first] AS
SELECT " " metka, Price.NGroup, Price.Code, Price.Name, Ed_ism.EdName, Price.Price
FROM dbo.SQLPrice Price
INNER JOIN dbo.SQLED_ISM Ed_ism
ON (Price.EdIzm = Ed_ism.EdNum)
WHERE (Price.Code > "00000001")
AND (Price.Code < "11111111")
ORDER BY Price.NGroup, Price.Name, Ed_ism.EdName, Price.Code
GO

и вот это правильно или как?
dbo.SQLED_ISM Ed_ism
т.е. SQLPrice в одной базе, например DB1, а SQLED_ISM в другой, например DB2


 
bushmen ©   (2003-10-20 15:25) [7]

CREATE PROCEDURE [dbo].[select_first] AS
SELECT " " metka, Price.NGroup, Price.Code, Price.Name, Ed_ism.EdName, Price.Price
FROM dbo.SQLPrice Price
INNER JOIN dbo.SQLED_ISM Ed_ism
ON (Price.EdIzm = Ed_ism.EdNum)
WHERE (Price.Code > "00000001")
AND (Price.Code < "11111111")
ORDER BY Price.NGroup, Price.Name, Ed_ism.EdName, Price.Code


Что это за апострофы после SELECT? При таком написании выбираться будет из таблиц, расположенных в одной базе. Надо так:

SELECT Price.metka, Price.NGroup, Price.Code, Price.Name, Ed_ism.EdName, Price.Price
FROM db1.dbo.SQLPrice Price
INNER JOIN db2.dbo.SQLED_ISM Ed_ism
ON (Price.EdIzm = Ed_ism.EdNum)
WHERE (Price.Code > "00000001")
AND (Price.Code < "11111111")
ORDER BY Price.NGroup, Price.Name, Ed_ism.EdName, Price.Code


 
denmin ©   (2003-10-20 15:51) [8]

попробовал, говорит Cannot resolve collation conflict for equal to operation. А я написал так

CREATE PROCEDURE [dbo].[select_first] AS
SELECT Price.NGroup, Price.Code, Price.Name, Ed_ism.EdName, Price.Price
FROM SQLReady.dbo.SQLPrice Price
INNER JOIN SQLSklad.dbo.SQLED_ISM Ed_ism
ON (Price.EdIzm = Ed_ism.EdNum)
WHERE (Price.Code > "00000001")
AND (Price.Code < "11111111")
ORDER BY Price.NGroup, Price.Name, Ed_ism.EdName, Price.Code

GO
где SQLReady и SQLSklad базы.


 
bushmen ©   (2003-10-20 16:20) [9]

Ну правильно - я имел в виду, что db1 и db2 - имена базы данных, которые надо изменять в зависимости от Вашей конкретной ситуации


 
denmin ©   (2003-10-20 16:57) [10]

Спасибо за совет, но, подставил и не работает, ругается. Смотрите выше.


 
bushmen ©   (2003-10-20 17:09) [11]

>(Price.Code > "00000001")

Ты не можешь применять математические операции к символам. Надо

(Price.Code > 1) AND (Price.Code < 11111111)


 
MOA ©   (2003-10-20 17:09) [12]

>Cannot resolve collation conflict for equal to operation
Похоже, у Вас разные COLLATION для Ваших баз SQLReady и SQLSklad. Необходимо либо сделать их одинаковыми и равными COLLATION для tempdb (и придётся ручками или скриптом менять COLLATION для символьных полей, которые не User defined data types), или в операциях сравнения (в Вашем случае, это либо Price.EdIzm = Ed_ism.EdNum либо Price.Code > "00000001" либо Price.Code < "11111111") пользоваться CAST.
Удачи!


 
denmin ©   (2003-10-21 08:11) [13]

Здравствуйте, извините, что вчера ушел, но домой тоже надо ходить. А Price.EdIzm и Ed_ism.EdNum у меня nvarchar 2,а Price.Code nvarchar 8.


 
MOA ©   (2003-10-21 10:13) [14]

Следовательно, диагноз верный. Посмотрите свойства Ваших баз, последняя строка. Удобно, когда COLLATION баз равнен COLLATION базы tempdb (лучше и msdb и model) - иначе без CAST Вы не сможете использовать символьные переменные в функциях и процедурах.
Кстати, разный COLLATION бывает, если Вы перенесли базу со старого сервера, SQL 7, например, или просто с другого сервера.
Удачи!


 
bushmen ©   (2003-10-21 10:29) [15]

Пользуйтесь функцией преобразования типов cast


 
denmin ©   (2003-10-21 11:04) [16]

но у меня Price.EdIzm и Ed_ism.EdNum nvarchar 2 (ругается Cannot resolve collation conflict for equal to operation.), ставлю int все работает.
Может какой-то оператор есть, который переводит nvarchar->int, например NVarCharToInt(Price.EdIzm) и т.п.?


 
MOA ©   (2003-10-21 11:09) [17]

>Может какой-то оператор есть, который переводит nvarchar->int
Есть. CAST и CONVERT
CAST(EdIzm AS Integer)
CONVERT(Integer, EdIzm)
Но в Вашем случае это не решение, см. выше.


 
denmin ©   (2003-10-21 11:32) [18]

>Но в Вашем случае это не решение, см. выше.
Но работает же. А что смущает, если можете ответьте пожалуйста.


 
MOA ©   (2003-10-21 11:33) [19]

Да, забыл. Вот попробуйте примерно так, чтобы увидеть эффект COLLATE:

SELECT Price.NGroup, Price.Code, Price.Name, Ed_ism.EdName, Price.Price
FROM SQLReady.dbo.SQLPrice Price
INNER JOIN SQLSklad.dbo.SQLED_ISM Ed_ism
ON (CAST(Price.EdIzm AS nchar(2))COLLATE Cirillic_General_CI_AS = CAST(Ed_ism.EdNum AS nchar(2)) COLLATE Cirillic_General_CI_AS)
WHERE (CAST(Price.Code AS nchar(8)) COLLATE Cirillic_General_CI_AS > CAST("00000001" AS nchar(8)) COLLATE Cirillic_General_CI_AS)
AND (CAST(Price.Code AS nchar(8))COLLATE Cirillic_General_CI_AS < CAST("11111111" AS nchar(8)) COLLATE Cirillic_General_CI_AS)

Вот про такой примерно геморрой (от разных COLLATION) и идёт речь.
В Вашем случае: Price.EdIzm имеет тот же COLLATION, что и SQLReady, Ed_ism.EdNum -
SQLSklad, а "00000001" и "11111111" - COLLATION той базы, в которой находится процедура.
Удачи!


 
bushmen ©   (2003-10-21 11:34) [20]

>MOA ©
>Но в Вашем случае это не решение, см. выше.

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


 
MOA ©   (2003-10-21 11:36) [21]

Пардон, можно проще, без CAST:
SELECT Price.NGroup, Price.Code, Price.Name, Ed_ism.EdName, Price.Price
FROM SQLReady.dbo.SQLPrice Price
INNER JOIN SQLSklad.dbo.SQLED_ISM Ed_ism
ON (Price.EdIzm COLLATE Cirillic_General_CI_AS = Ed_ism.EdNum COLLATE Cirillic_General_CI_AS )
WHERE (Price.Code COLLATE Cirillic_General_CI_AS > "00000001" COLLATE Cirillic_General_CI_AS )
AND (Price.Code COLLATE Cirillic_General_CI_AS < "11111111" COLLATE Cirillic_General_CI_AS )


 
MOA ©   (2003-10-21 11:39) [22]

>после преобразования строки в число эта проблема решается
До тех пор, пока Вы не решите написать процедуру или функцию, в которой решите или сравнивать именно символьные поля, или воспользуетесь символьными переменными, или временными таблицами с символьными полями.
Решение - сменить COLLATION, IMHO.
Удачи!


 
bushmen ©   (2003-10-21 11:43) [23]

>Решение - сменить COLLATION, IMHO

Все зависит от решаемой задачи.



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.045 c
3-40976
kostik78ua
2003-10-16 18:12
2003.11.13
rownum


14-42050
Denis_Ac
2003-09-25 06:50
2003.11.13
Красноярцы ---->


1-41345
ghost_by
2003-11-03 16:52
2003.11.13
Встраивание компонентов в TStringGrid


1-41521
maestro
2003-10-28 07:55
2003.11.13
уничтожение компонента Button


7-42163
Пубертанец
2003-09-02 11:49
2003.11.13
Как поменять системное время на компе?