Форум: "Базы";
Текущий архив: 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