> -- 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
"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'
)