Krzysztof Gil

Krzysztof Gil Projektant,
programista,
szkoleniowiec

Temat: Dziwny problem w funkcji T-SQLa

Ostatnio stworzyłem funkcję do składania stringu parametrów przy sortowaniu po dowolnej liczbie dowolnych pól tabeli:

CREATE FUNCTION [dbo].[GetSortString] (@FunctionID INT)
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @ReturnVal VARCHAR(255)
SET @ReturnVal='' COLLATE SQL_Polish_CP1250_CI_AS

SELECT @ReturnVal=@ReturnVal + AttributName + ' ' + SortMetod + ' ,' COLLATE SQL_Polish_CP1250_CI_AS
FROM SortString
WHERE FunctionID=@FunctionID AND UserName=suser_sname()

IF LEN(@ReturnVal) > 1 SET @ReturnVal= SUBSTRING(@ReturnVal,1,LEN(@ReturnVal)-1) COLLATE SQL_Polish_CP1250_CI_AS

RETURN( @ReturnVal )
END

gdzie SortString jest widokiem zwracającym uporządkowaną listę atrybutów i metod sortowania (AttributName, SortMetod) dla danej funkcji/tabeli (FunctionID) i użytkownika (UserName). Specjalnie dodałem COLLATE, aby nie mieć problemów z kodowanie znaków.

Okazało się, że w jednej bazie działa super, a w drugiej pojawia się błąd 457: "Implicit conversion of varchar value to varchar cannot be performed because the collation of the value is unresolved due to a collation conflict"

Oczywiście baza ma inny standard kodowania znaków, niż ta działająca, ale miałem nadzieję, że konwersja COLLATE sobie z tym poradzi. Czyżby nie można było takiej funkcji zbudować na systemie, w którym są różne standardy kodowania dla poszczególnych baz/ tabel?

Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: Dziwny problem w funkcji T-SQLa

na jakiej bazie działa a na jakiej nie?
Pamiętaj też, że polskie znaczki zajmuja więcej znaków niż hamerykańskie. Oczywiście nie musi to byc ten problem ale:
pole varchar (30) bez polskich znakow odpowiada dajmy na to varchar (50) temu samemu wpisowi z polskimi znakami ( bo np ą zajmuje tak naprawdę 8 znaków)
ale to tylko sugestia
napisz jakie bazy nie grają

konto usunięte

Temat: Dziwny problem w funkcji T-SQLa

Odpowiedz bazy wyraznie wskazuje na problem z porownaniem dwoch ciagow tekstowych, to raczej nie ma znaczenia czy sa tam polskie znaczki czy nie.
Collation musisz ustawic, przy kazdym porownaniu, przypuszczam, ze tutaj jest problem:

WHERE FunctionID=@FunctionID AND UserName=suser_sname()

sprobuj z:

WHERE FunctionID=@FunctionID COLLATE database_default AND UserName=suser_sname() COLLATE database_default


Najlepiej nie wskazywac konkretnego a uzyc: COLLATE database_default to zapewni ci przenosnosc kodu (pod warunkiem, ze serwer obsluguje takie kodowanie znakow jakie jest ci potrzebne)

Następna dyskusja:

Problem z MPP




Wyślij zaproszenie do