![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
выборка в MS SQL2000 [D5, MSSQL]
denmin © (2003-10-20 13:31:00)
Здравствуйте.
Есть простой запрос в 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-21 11:43:00) [1]
>Решение - сменить COLLATION, IMHO
Все зависит от решаемой задачи.
MOA (2003-10-21 11:39:00) [2]
>после преобразования строки в число эта проблема решается
До тех пор, пока Вы не решите написать процедуру или функцию, в которой решите или сравнивать именно символьные поля, или воспользуетесь символьными переменными, или временными таблицами с символьными полями.
Решение - сменить COLLATION, IMHO.
Удачи!
MOA (2003-10-21 11:36:00) [3]
Пардон, можно проще, без 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 )
bushmen (2003-10-21 11:34:00) [4]
>MOA ©
>Но в Вашем случае это не решение, см. выше.
по-моему, как раз и решение. COLLATION существует для символьных полей, так что после преобразования строки в число эта проблема решается
MOA (2003-10-21 11:33:00) [5]
Да, забыл. Вот попробуйте примерно так, чтобы увидеть эффект 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 той базы, в которой находится процедура.
Удачи!
denmin (2003-10-21 11:32:00) [6]
>Но в Вашем случае это не решение, см. выше.
Но работает же. А что смущает, если можете ответьте пожалуйста.
MOA (2003-10-21 11:09:00) [7]
>Может какой-то оператор есть, который переводит nvarchar->int
Есть. CAST и CONVERT
CAST(EdIzm AS Integer)
CONVERT(Integer, EdIzm)
Но в Вашем случае это не решение, см. выше.
denmin (2003-10-21 11:04:00) [8]
но у меня Price.EdIzm и Ed_ism.EdNum nvarchar 2 (ругается Cannot resolve collation conflict for equal to operation.), ставлю int все работает.
Может какой-то оператор есть, который переводит nvarchar->int, например NVarCharToInt(Price.EdIzm) и т.п.?
bushmen (2003-10-21 10:29:00) [9]
Пользуйтесь функцией преобразования типов cast
MOA (2003-10-21 10:13:00) [10]
Следовательно, диагноз верный. Посмотрите свойства Ваших баз, последняя строка. Удобно, когда COLLATION баз равнен COLLATION базы tempdb (лучше и msdb и model) - иначе без CAST Вы не сможете использовать символьные переменные в функциях и процедурах.
Кстати, разный COLLATION бывает, если Вы перенесли базу со старого сервера, SQL 7, например, или просто с другого сервера.
Удачи!
denmin (2003-10-21 08:11:00) [11]
Здравствуйте, извините, что вчера ушел, но домой тоже надо ходить. А Price.EdIzm и Ed_ism.EdNum у меня nvarchar 2,а Price.Code nvarchar 8.
MOA (2003-10-20 17:09:00) [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.
Удачи!
bushmen (2003-10-20 17:09:00) [13]
>(Price.Code > "00000001")
Ты не можешь применять математические операции к символам. Надо
(Price.Code > 1) AND (Price.Code < 11111111)
denmin (2003-10-20 16:57:00) [14]
Спасибо за совет, но, подставил и не работает, ругается. Смотрите выше.
bushmen (2003-10-20 16:20:00) [15]
Ну правильно - я имел в виду, что db1 и db2 - имена базы данных, которые надо изменять в зависимости от Вашей конкретной ситуации
denmin (2003-10-20 15:51:00) [16]
попробовал, говорит 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 15:25:00) [17]
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:18:00) [18]
у меня вот так
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 14:56:00) [19]
Ничего не надо туда ставить.
denmin (2003-10-20 14:50:00) [20]
извините, но я только начинаю, а в книге не написано. А что вместо двух точек ставить в FROM db1..First First?