Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ansi Zeichensatz in SQL Tabellen !!!

43 views
Skip to first unread message

Sascha Bitter

unread,
Sep 1, 2000, 4:23:01 AM9/1/00
to
Hallo Leute brauche Hilfe,
habe Tabellen importiert aus BTrieve mit dem Dos Zeichensatz ANSI in
MSSQL7.0 Tabellen im OEM Format und habe mir folgendes Script geschrieben
aber leider kann ich es nur auf eine Tabelle und einen Feldinhalt anwenden
kann mir jemand weiterhelfen wie ich es globalen auf alle Tabelle und alle
Felder anwenden kann????
überall wo Ö,ü, usw. drinstand sind merkwürdige zeichen halt ansi format...
also bitte helft mir folgendes script globaler zu machen.

> -- Dieses Skript konvertiert die Einträge in den folgenden Tabellen und
> Spalten:
-- MyTable (MyField)
print '-- MyTable (MyField)'
go
SET NOCOUNT ON
declare @vorher varchar(255),
@nachher varchar(255),
@zeichen char,
@zeiger int,
@laenge int

declare konvertierung cursor for
select MyField from MyTable
for update
OPEN konvertierung
FETCH NEXT FROM konvertierung INTO @vorher
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
select @zeiger = 1
select @nachher = ''
select @laenge = DATALENGTH(@vorher)
while @zeiger <= @laenge
BEGIN
select @zeichen = substring(@vorher, @zeiger, 1)
select @zeichen =
case ascii(@zeichen)
when 132 then
'ä'
when 148 then
'ö'
when 129 then
'ü'
when 142 then
'Ä'
when 153 then
'Ö'
when 154 then
'Ü'
when 225 then
'ß'
else
@zeichen
end
select @nachher = @nachher + @zeichen
select @zeiger = @zeiger + 1
end
update MyTable set MyField = @nachher where current of konvertierung

END
FETCH NEXT FROM konvertierung INTO @vorher
END
DEALLOCATE konvertierung
GO

print '-- Umsetzung beendet'
go

Elmar Boye

unread,
Sep 1, 2000, 8:11:50 AM9/1/00
to
Hallo Sascha,

"Sascha Bitter" <s.bi...@cyclus-ag.de> schrieb ...


> Hallo Leute brauche Hilfe,
> habe Tabellen importiert aus BTrieve mit dem Dos Zeichensatz ANSI in
> MSSQL7.0 Tabellen im OEM Format und habe mir folgendes Script geschrieben
> aber leider kann ich es nur auf eine Tabelle und einen Feldinhalt anwenden
> kann mir jemand weiterhelfen wie ich es globalen auf alle Tabelle und alle
> Felder anwenden kann????
> überall wo Ö,ü, usw. drinstand sind merkwürdige zeichen halt ansi
format...
> also bitte helft mir folgendes script globaler zu machen.
>

etwas Geduld musst Du bei solchen exotischen Dingen schon
mitbringen...

Ich habe mal zwei SP's produziert, die eine OEM->ANSI Konvertierung
über eine Stored Procedure erledigen.
Auch wenn ich dies denn doch eher durch den DTS-Assistenten machen
würde oder aber BCP und zwischengeschaltetes Konvertierungsprogramm.

Die SP's sind derzeit auf VARCHAR begrenzt, weitere Erweiterungen
überlass ich Dir gern. Einen Test auf alle Eventualitäten - u. a.
Leerzeichen in Spaltennamen ebenfalls.

Der Aufruf erfolgt als spOEMToAnsi 'Tabelle'.

Gruss
Elmar

Und nun die Procs

CREATE PROC spOEMToAnsi
(
@inString VARCHAR(255),
@outString VARCHAR(255) OUTPUT
)
AS
/* Prozedur zum Konvertieren einer VARCHAR-Zeichenkette
* vom OEM nach ANSI
* Derzeit begrenzt auf deutsche Umlaute
* Verwendet von spOEMToAnsiTable
* Autor: Elmar Boye 01.09.2000 für SQL Server NG
*/
SET NOCOUNT ON

IF @inString IS NULL
BEGIN
SELECT @outString = NULL
RETURN 1
END

SELECT @outString = CAST(@inString AS VARBINARY)
SELECT @outString = REPLACE(@outString,
CAST(132 AS VARBINARY(1)),
CAST('ä' AS VARBINARY(1)))
SELECT @outString = REPLACE(@outString,
CAST(148 AS VARBINARY(1)),
CAST('ö' AS VARBINARY(1)))
SELECT @outString = REPLACE(@outString,
CAST(129 AS VARBINARY(1)),
CAST('ü' AS VARBINARY(1)))
SELECT @outString = REPLACE(@outString,
CAST(142 AS VARBINARY(1)),
CAST('Ä' AS VARBINARY(1)))
SELECT @outString = REPLACE(@outString,
CAST(153 AS VARBINARY(1)),
CAST('Ö' AS VARBINARY(1)))
SELECT @outString = REPLACE(@outString,
CAST(154 AS VARBINARY(1)),
CAST('Ü' AS VARBINARY(1)))
SELECT @outString = REPLACE(@outString,
CAST(225 AS VARBINARY(1)),
CAST('ß' AS VARBINARY(1)))
IF @outString <> @inString
RETURN 0
ELSE
RETURN 1
GO

CREATE PROC spOEMToAnsiTable
(
@TableName sysname
)
AS
/* Prozedur zum Konvertieren OEM ANSI in Tabellen
* Arbeitet derzeit nur mit VARCHAR Spalten
* Benötigt die Prozedur spOEMToAnsi
* Autor: Elmar Boye 01.09.2000 für SQL Server NG
*/

DECLARE @ColumnName sysname
DECLARE @ColumnType sysname
DECLARE @ColumnLength int
DECLARE @nIndex int
DECLARE @CrLf varchar(2)
-- Variablendefinitionen
DECLARE @sqlDeclare varchar(8000)
-- Spaltenliste für SELECT
DECLARE @sqlSelect varchar(8000)
-- Spaltenliste für FETCH
DECLARE @sqlFetch varchar(8000)
-- Updateanweisung
DECLARE @sqlExec varchar(8000)
-- Prozeduraufrufe
DECLARE @sqlUpdate varchar(8000)

SET NOCOUNT ON

-- Konstante für CRLF
SELECT @CrLf = CHAR(13) + CHAR(10)
SELECT @nIndex = 0,
@sqlDeclare = '',
@sqlSelect = '',
@sqlFetch = '',
@sqlExec = '',
@sqlUpdate = ''

DECLARE curColumns CURSOR LOCAL FAST_FORWARD
FOR
SELECT c.name AS ColumnName,
t.name AS ColumnType,
c.length AS ColumnLength
FROM syscolumns c
INNER JOIN systypes t
ON c.type = t.type
WHERE c.id = OBJECT_ID(@TableName)
AND t.name = 'VARCHAR'
ORDER BY colorder


OPEN curColumns
FETCH curColumns
INTO @ColumnName, @ColumnType, @ColumnLength
WHILE @@fetch_status = 0
BEGIN
SELECT @nIndex = @nIndex + 1
IF @nIndex > 1
SELECT @sqlSelect = @sqlSelect + ', ',
@sqlFetch = @sqlFetch + ', ',
@sqlUpdate = @sqlUpdate + ', ' + @CrLf

SELECT @sqlDeclare = @sqlDeclare +
'DECLARE @in' + @ColumnName +
' VARCHAR(' + CAST(@ColumnLength AS varchar) + '),' +
' @out' + @ColumnName +
' VARCHAR(' + CAST(@ColumnLength AS varchar) + ') ' + @CrLf

SELECT @sqlSelect = @sqlSelect + @ColumnName,
@sqlFetch = @sqlFetch + '@in' + @ColumnName,
@sqlUpdate = @sqlUpdate + @ColumnName +
'= @out' + @ColumnName

SELECT @sqlExec = @sqlExec +
'EXEC spOemToAnsi @in' + @ColumnName + ', ' +
'@out' + @ColumnName + ' OUTPUT ' + @CrLf

FETCH curColumns
INTO @ColumnName, @ColumnType, @ColumnLength
END
CLOSE curColumns
DEALLOCATE curColumns

-- Nix gefunden
IF @nIndex = 0 RETURN 1

EXEC (
'DECLARE @nCount int' + @CrLf +
@sqlDeclare + @CrLf +
'DECLARE curTable CURSOR LOCAL KEYSET FOR ' + @CrLf +
'SELECT ' + @sqlSelect + ' FROM ' + @TableName + ' ' + @CrLf +
'FOR UPDATE' + @CrLf +
'--SET NOCOUNT ON' + @CrLf +
'SELECT @nCount = 0 ' + @CrLf +
'OPEN curTable' + @CrLf +
'FETCH curTable INTO ' + @sqlFetch + @CrLf +
'WHILE @@fetch_status <> -1 BEGIN' + @CrLf +
' IF @@fetch_status = -2 GOTO SkipDeleted' + @CrLf +
' SELECT @nCount = @nCount + 1 ' + @CrLf +
@sqlExec +
' UPDATE ' + @TableName + ' SET ' + @CrLf +
@sqlUpdate + @CrLf +
' WHERE CURRENT OF curTable' + @CrLf +
'SkipDeleted:' + @CrLf +
' FETCH curTable INTO ' + @sqlFetch + @CrLf +
'END' + @CrLf +
'CLOSE curTable' + @CrLf +
'DEALLOCATE curTable' + @CrLf +
'SELECT "' + @TableName + '" AS Tabelle, @nCount AS Zeilen'
)


0 new messages