Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

выборка в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.041 c
1-41534
P0tia
2003-11-04 12:21
2003.11.13
Image, путь к иконке


3-41032
axx
2003-10-15 11:26
2003.11.13
FrozenRows в DBGgrid е


4-42290
Omega27
2003-09-10 20:31
2003.11.13
Взят кусок из одново окна в другого.


1-41241
Ganjo
2003-10-30 21:09
2003.11.13
StringGrid


3-40914
McSimm2
2003-10-20 10:31
2003.11.13
Количество изменений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский