BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki
Użytkownik usunięty VIP
Użytkownik usunięty
40 pkt.
Poczatkujacy
Właściciel projektów
Właściciel projektów
Uczestnik projektów
Uczestnik projektów
Uczestnik projektów
Uczestnik projektów
Uczestnik projektów

 
0


Witam,
SQL 2008
Nie bardzo się znam na sql ale problem jest taki, że trzeba przekonwertować dane pobierane z progressa z kodowania Mazovia na polskie znaki. Probowałem dodac kodowanie w connection string ale nie działałow.
 
dane wygladają np tak
p³ywaj¹ceujêcie--http://przemekkuczynski.pl/
tagi: SQL

http://pl.linkedin.com/in/przemekkuczynski/




Liczba postów:

Paweł Potasiński Microsoft
Paweł Potasiński
7713 pkt.
Guru
 
0


Trzeba by sobie napisać funkcję w T-SQL, która zamieni Ci wybrane znaki z kodowania Mazovia na CP1250. Wystarczy pewnie znać tablicę tych znaków (ich kody ASCII) i użyć paru funkcji z ASCII i CHAR / NCHAR na czele.--

Pozdrawiam,
Paweł Potasiński

Użytkownik usunięty VIP
Użytkownik usunięty
40 pkt.
Poczatkujacy
Właściciel projektów
Właściciel projektów
Uczestnik projektów
Uczestnik projektów
Uczestnik projektów
Uczestnik projektów
Uczestnik projektów
 
0


Możesz napisać jakiś przykład konwersji tych 2 słów ?
Tutaj są kody ascii
http://www.arczer.neostrada.pl/ar005.htm--http://przemekkuczynski.pl/

http://pl.linkedin.com/in/przemekkuczynski/

Paweł Potasiński Microsoft
Paweł Potasiński
7713 pkt.
Guru
 
0





[Kod]
declare @WordMazovia varchar(100)
set @WordMazovia = 'p’ywaj†cy'
select replace (
replace(
@WordMazovia, char(146), char(179)
), char(134), char(185)
)





Powyżej dla uproszczenia zamiana tylko dwóch znaków (ą i ł). Musisz oczywiście obsłużyć także pozostałe. Czeka Cię pisanie sporej ilości REPLACE'ów. Ew. możesz spróbować tłumaczyć znak po znaku, ale do tego musiałbyś sobie napisać kolejne funkcje w T-SQL.
--

Edytowano 1 raz. Ostatnio 2010-06-14 14:32:42 przez C3PO.

Pozdrawiam,
Paweł Potasiński

Użytkownik usunięty VIP
Użytkownik usunięty
40 pkt.
Poczatkujacy
Właściciel projektów
Właściciel projektów
Uczestnik projektów
Uczestnik projektów
Uczestnik projektów
Uczestnik projektów
Uczestnik projektów
 
0


Dziêki ;)--http://przemekkuczynski.pl/

http://pl.linkedin.com/in/przemekkuczynski/

Wojciech Mazgaj
Wojciech Mazgaj
17 pkt.
Nowicjusz
 
0


 tak to dobre rozwiazanie ale jak zalezy na wydajności
to proponuje analogiczna  funkcje w CRL bo jest dużo szybsza--

Paweł Potasiński Microsoft
Paweł Potasiński
7713 pkt.
Guru
 
0


Tak, ale T-SQL jest uniwersalny i działa też na SQL Server 2000 ;-)
 
PS. Masz może gotowy kod .NET do implementacji podobnych przekształceń?--

Pozdrawiam,
Paweł Potasiński

vezdohan
vezdohan
779 pkt.
Senior
 
0


Chyba nie jest tak prosto.
Mazowia Ą - 143 ->1250 - 165
Ale Mazowia 165 to Ń ->1250 209
Więc kolejność konwersji ma znaczenie bo nam Ą na Ń przeskoczy

Paweł Potasiński Microsoft
Paweł Potasiński
7713 pkt.
Guru
 
0


Brawo za czujność, zupełnie o tym zapomniałem. Kajam się i ponawiam próbę z REPLACE :-)
 



[Kod]
CREATE FUNCTION dbo.ufn_MazoviaTo1250 (@String varchar(max))
RETURNS varchar(max)
AS
BEGIN
RETURN
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
@String, CHAR(165), CHAR(209) -- Ń
), CHAR(143), CHAR(165) -- Ą
), CHAR(163), CHAR(211) -- Ó
), CHAR(156), CHAR(163) -- Ł
), CHAR(149), CHAR(198) -- Ć
), CHAR(144), CHAR(202) -- Ę
), CHAR(152), CHAR(140) -- Ś
), CHAR(160), CHAR(143) -- Ź
), CHAR(161), CHAR(175) -- Ż
), CHAR(134), CHAR(185) -- ą
), CHAR(141), CHAR(230) -- ć
), CHAR(145), CHAR(234) -- ę
), CHAR(146), CHAR(179) -- ł
), CHAR(164), CHAR(241) -- ń
), CHAR(162), CHAR(243) -- ó
), CHAR(158), CHAR(156) -- ś
), CHAR(166), CHAR(159) -- ź
), CHAR(167), CHAR(191) -- ż
);
END;
GO

SELECT dbo.ufn_MazoviaTo1250 ('Ź•śĄŁ˜ ˇ†Ť‘’¤˘ž¦§');




 --

Pozdrawiam,
Paweł Potasiński

Marek Adamczuk Ekspert WSS
Marek Adamczuk
2392 pkt.
Guru
 
0


Wszystko się zgadza z dokładnością do collation. Niektóre z literek są np. czułe na case. Na wszelki wypadek radziłbym obcollate'ować string przekazany parametrem na Polish_BIN, żeby bezpiecznie zamieniać poszczególne znaczki odwołując się do nich funkcją CHAR. Np. zastosowanie upper na argumencie powoduje taki sam wynik końcowy jak przed, a nie jestem pewien, czy na pewno o to nam chodzi.
 
 --__________ Pozdrawiam Marek Adamczuk

__________
Pozdrawiam
Marek Adamczuk

Paweł Potasiński Microsoft
Paweł Potasiński
7713 pkt.
Guru
 
0


Cenna uwaga, zatem sugerujesz, żeby finalnie wyszedł taki potworek:
 



[Kod]
CREATE FUNCTION dbo.ufn_MazoviaTo1250 (@String varchar(max))
RETURNS varchar(max)
AS
BEGIN
RETURN
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
REPLACE (
@String COLLATE Polish_BIN, CHAR(165), CHAR(209) -- Ń
), CHAR(143), CHAR(165) -- Ą
), CHAR(163), CHAR(211) -- Ó
), CHAR(156), CHAR(163) -- Ł
), CHAR(149), CHAR(198) -- Ć
), CHAR(144), CHAR(202) -- Ę
), CHAR(152), CHAR(140) -- Ś
), CHAR(160), CHAR(143) -- Ź
), CHAR(161), CHAR(175) -- Ż
), CHAR(134), CHAR(185) -- ą
), CHAR(141), CHAR(230) -- ć
), CHAR(145), CHAR(234) -- ę
), CHAR(146), CHAR(179) -- ł
), CHAR(164), CHAR(241) -- ń
), CHAR(162), CHAR(243) -- ó
), CHAR(158), CHAR(156) -- ś
), CHAR(166), CHAR(159) -- ź
), CHAR(167), CHAR(191) -- ż
) COLLATE database_default;
END;
GO




Edycja: W zasadzie może by było bezpieczniej na koniec jeszcze odwrócić zmianę collation :-) Bo jak się okaże, że ktoś tego chce dziwnym trafem do sortowania czy porównywania użyć, to może zabić.
--

Edytowano 1 raz. Ostatnio 2010-06-15 12:29:01 przez C3PO.

Pozdrawiam,
Paweł Potasiński

Marek Adamczuk Ekspert WSS
Marek Adamczuk
2392 pkt.
Guru
 
0


Do nirwany przydałby się jeszcze schemabinding :). Wtedy funkcja byłaby deterministyczna, a więc potencjalnie odrobinkę szybsza.
 
 
 --__________ Pozdrawiam Marek Adamczuk

__________
Pozdrawiam
Marek Adamczuk

Paweł Potasiński Microsoft
Paweł Potasiński
7713 pkt.
Guru
 
0


Zlituję się i nie wkleję kolejnej wersji :-) Swoją drogą aż prosi się o zrobienie jakiejś mikrostruktury (parę tabelek do trzymania mapy numerków ASCII pomiędzy kodowaniami), żeby mechanizm był bardziej uniwersalny. Bo dzisiaj potrzebne jest tłumaczenie Mazovii, a co będzie jutro...
 
PS. Chyba powalczę jeszcze z odpowiednikiem .NET-owym.--

Pozdrawiam,
Paweł Potasiński

Marek Adamczuk Ekspert WSS
Marek Adamczuk
2392 pkt.
Guru
 
0


Kiedyś taki wystrugałem :). Ale funkcje i tak generuję na podstawie wpisów - bez czytania jakiejkolwiek tabeli są o niebo szybsze.--__________ Pozdrawiam Marek Adamczuk

__________
Pozdrawiam
Marek Adamczuk

Paweł Potasiński Microsoft
Paweł Potasiński
7713 pkt.
Guru
 
0


Nikt nie zauważył, ale chyba nie można podwójnie COLLATE'ować ;-)
Zatem powyższa funkcja powinna wyglądać tak:
 



[Kod]
ALTER FUNCTION dbo.ufn_MazoviaTo1250 (@String varchar(max))
RETURNS varchar(max)
WITH SCHEMABINDING
AS
BEGIN
SET @String = @String COLLATE Polish_BIN;
RETURN
REPLACE (
...
@String, CHAR(165), CHAR(209) -- Ń
...
) COLLATE database_default;
END;
GO





To tak dla dopełnienia tematu. A CLR-em się pobawię i tak ;-)--

Pozdrawiam,
Paweł Potasiński

Paweł Potasiński Microsoft
Paweł Potasiński
7713 pkt.
Guru
 
0


Jak ktoś jest ciekawy moich dalszych przemyśleń w temacie (opartych o CLR), to zapraszam do poczytania w dwóch częściach:
 
http://sqlwars.blog.com/2010/06/16/sql-server-jak-wylistowac-dostepne-kodowania-funkcja-tabelaryczna-clr/
 
http://sqlwars.blog.com/2010/06/22/sql-server-konwersja-kodowania-cp620-mazovia-na-cp1250-w-clr/
 
Wszelkie uwagi mile widziane. W końcu może coś tam pokpiłem i jestem tego nieświadomy :-)--sqlwars.blog.com

Pozdrawiam,
Paweł Potasiński

Udziel odpowiedzi

pkt.
Treść wpisu:

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.