Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

выборка в MS SQL2000 [D5, MSSQL]


Страницы:   1 2

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?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо