Announcement

Collapse
No announcement yet.

collation_name auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • collation_name auslesen

    Beim Erzeugen einer Tabelle besteht die Möglichkeit über COLLATE einen collation_name anzugeben. Gibt man diesen nicht an wird der Defaultwert genommen. Ich habe jetzt allerdings das Problem, dass dieser Defaultwert in bestimmten Fällen anders ist und dann das Matching nicht mehr funktioniert, daher meine Frage:

    Wie kann ich herausfinden, wie der aktuelle collation_name einer Tabelle ist, wenn ich diesen nicht explizit gesetzt habe? Steht das irgendwo in den Systemtabellen?

    Danke.

  • #2
    Hallo Rya,

    wie der aktuelle collation_name einer Tabelle
    Tabellen haben keine COLLATION, nur [n](var)CHAR Felder.

    Kannst Du auf 2 Weisen so ermitteln (pubs-Datenbank)
    [highlight=SQL]SELECT COLLATION_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'dbo'
    AND TABLE_NAME = 'authors'
    AND COLUMN_NAME = 'city'


    SELECT C.collation_name
    FROM sys.columns AS C
    INNER JOIN
    sys.tables AS T
    ON C.object_id = T.object_id
    WHERE C.name = 'city'
    AND T.name = 'authors'[/highlight]
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Wie O.Helper schon schrieb, gibt es keine COLLATION je Tabelle, jedoch die Datenbank selber hat eine definiert, die immer dann zum Tragen kommt, wenn man beim CREATE einer Spalte keine COLLATION explizit definiert. Probiere mal:
      select name, collation_name from sys.databases

      Und wenn da nichts drinnen steht, dann greift die Collation des Servers. Die sollte man eigentlich kriegen mit:
      select name, collation_name from sys.servers
      ... tut es aber (zumindest bei mir) nicht.
      Was aber stimmt:
      select SERVERPROPERTY('Collation')


      bye,
      Helmut

      Comment


      • #4
        Danke für die Hilfe, hab das jetzt hinbekommen den collation_name zu ändern, das geht allerdings nur, wenn man vorher alle Primär-, Fremdschlüssel und Indizes löscht. Ich muss sie also danach wieder einfügen, nur irg.wie tut sich SQL Server 2005 ein wenig schwer den Primärschlüssel wieder einzufügen, ich benutze folgende Syntax:
        ALTER TABLE [dbo].[PatientMeasurementResults] ADD CONSTRAINT [PK__PatientMeasurementResults] PRIMARY KEY CLUSTERED
        (
        [MeasurementTime] ASC,
        [ModelName] ASC,
        [DeviceID] ASC,
        [DeviceTestID] ASC
        )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
        Das ist genau die Syntax die mir SQL Server 2005 zurückgibt wenn ich auf "Skript für Primärschlüssel anzeigen als CREATE IN" gehe, aber wenn ich diese ausführen will kommt gleich die Fehlermeldung "Zeile 7: Falsche Syntax in der Nähe von '('." sehr seltsam.

        Für die Fremdschlüssel funktioniert es und die Indizes kann ich nichtmal löschen über die vorgegebene Syntax.

        Comment


        • #5
          Es gibt einen ziemlichen Unterschied zwischen CREATE und ALTER TABLE.

          Beim ALTER kannst Du keinen CLUSTERED PRIMARY KEY anlegen.
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #6
            Echt? Also kann man nur beim ersten Erzeugen der Tabelle einen CLUSTERED PRIMARY KEY anlegen und sobald man mal eine Einstellung wie collation_name ändern will muss man diesen durch einen NON-CLUSTERED PRIMARY KEY ersetzen?

            Auch wenn ich das keyword "CLUSTERED" weglasse kommt aber immernoch die gleiche Fehlermeldung.

            Und wieso gibt mir der SQL Server Manager diese Syntax an, wenn sie gar nicht zulässig ist?

            Comment


            • #7
              wieso gibt mir der SQL Server Manager diese Syntax an
              Weil Du Dir ein Script für CREATE hast erzeugen lassen, nicht für ALTER.

              Ändere mal über den Designer eine vorhandenen PK und lass Dir mal das Änderungsscript anzeigen.

              Das läuft ungefähr so ab:

              CREATE TABLE tmp_Tabelle
              COPY Tabelle => tmp_Tabelle
              DROP TABLE Tabelle
              RENAME tmp_Tabelle => Tabelle
              Olaf Helper

              <Blog> <Xing>
              * cogito ergo sum * errare humanum est * quote erat demonstrandum *
              Wenn ich denke, ist das ein Fehler und das beweise ich täglich

              Comment


              • #8
                Von Keys, kann man sich aber nur "CREATE" oder "DROP" Skripte anzeigen lassen und beide führen halt zu dieser ALTER TABLE Syntax. Über Rechtsklick ändern komme ich direkt zum Tabellen-Designer, gibt es da ne Möglichkeit sich ein Änderungsskript anzeigen zu lassen?

                CREATE TABLE tmp_Tabelle
                COPY Tabelle => tmp_Tabelle
                DROP TABLE Tabelle
                RENAME tmp_Tabelle => Tabelle
                Hab schon fast befürchtet, dass man sowas machen muss.


                Danke für die Hilfe.


                Edit: Wenn man über den Designer einen neuen CLUSTERED PRIMARY KEY erzeugen kann müsste es doch auch über SQL Befehle gehen... oder macht der etwa explizit immer eine neue Tabelle?


                Edit2: Okay ich hab jetzt das Änderungskript, danke.
                Zuletzt editiert von Rya; 13.11.2008, 17:16.

                Comment


                • #9
                  Sorry, dass ich nochmal poste, aber ich hab noch eine themenbezogene Frage zum collation_name.

                  Wenn ich eine Temporäre Tabelle über folgende Syntax erzeuge:
                  SELECT *
                  INTO #temptable
                  FROM MyTable
                  WHERE (0 = 1)
                  Wird dann der collation_name der Tabelle "MyTable" übernommen, oder der aus der Datenbank benutzt?

                  Ich würde es ja selbst testen, aber bei temporären Tabellen scheint man den collation_name der Spalten nicht überprüfen zu können.

                  Comment


                  • #10
                    Hallo Rya,

                    doch geht schon, der MSSQL muss es sich ja auch irgendwo merken: In der TempDB

                    [highlight=SQL]CREATE TABLE #myTemp
                    (Feld1 varchar(5) COLLATE SQL_Latin1_General_CP1_CI_AS,
                    Feld2 varchar(5) COLLATE SQL_Latin1_General_CP1_CS_AS
                    )
                    GO
                    INSERT INTO #myTemp (Feld1, Feld2) VALUES ('A', 'B')
                    GO
                    SELECT *
                    INTO #myTemp2
                    FROM #myTemp
                    WHERE 1=0
                    GO

                    SELECT *
                    FROM tempdb.sys.TABLES
                    WHERE name LIKE '#myTemp__%'

                    SELECT T.name, C.collation_name
                    FROM tempdb.sys.COLUMNS AS C
                    INNER JOIN
                    tempdb.sys.TABLES AS T
                    ON C.object_id = T.object_id
                    WHERE T.name LIKE '#myTemp__%'
                    GO

                    DROP TABLE #myTemp2
                    DROP TABLE #myTemp
                    GO[/HIGHLIGHT]

                    Du siehst, die COLLATION wird übernommen
                    Olaf Helper

                    <Blog> <Xing>
                    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                    Comment


                    • #11
                      Praktisch, wenn so die COLLATION übernommen wird.

                      Kann dein Skript leider nicht ausführen, da kommt die Fehlermeldung "Ungültiger Objektname 'tempdb.sys.TABLES'.".

                      Comment


                      • #12
                        Du bekommst eine Fehlermeldung?
                        Aber Du hast schon den MSSQL 2005 und nicht den 2000?

                        sys.TABLES gibt es erst ab 2005 (in dessen Forum wir hier gerade sind)
                        Bei 2000 kannst Du das View INFORMATION_SCHEMA.COLUMNS nutzen, wie im ersten Beispiel.
                        Olaf Helper

                        <Blog> <Xing>
                        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                        Comment


                        • #13
                          Ich hab zwar MSSQL 2005 (steht zumindest da), aber irg.wie fehlen diese ganzen "sys." Sachen... seltsam.

                          Bei INFORMATION_SCHEMA.COLUMNS sind leider keine temporären Tabellen enthalten.

                          Comment


                          • #14
                            Doch, auch dort ... in der TempDB.

                            Das Beispiel funktioniert auch mit dem MSSQL2000:

                            [highlight=SQL]CREATE TABLE #myTemp
                            (Feld1 varchar(5) COLLATE SQL_Latin1_General_CP1_CI_AS,
                            Feld2 varchar(5) COLLATE SQL_Latin1_General_CP1_CS_AS
                            )
                            GO
                            SELECT *
                            INTO #myTemp2
                            FROM #myTemp
                            WHERE 1=0
                            GO

                            SELECT TABLE_NAME, COLLATION_NAME
                            FROM tempdb.INFORMATION_SCHEMA.COLUMNS
                            WHERE TABLE_NAME LIKE '#myTemp__%'
                            GO

                            DROP TABLE #myTemp2
                            DROP TABLE #myTemp
                            GO[/HIGHLIGHT]
                            Olaf Helper

                            <Blog> <Xing>
                            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                            Comment


                            • #15
                              Danke funktioniert. ^^

                              Comment

                              Working...
                              X