Einfache Möglichkeit, Spalten und Zeilen in SQL zu transponieren?

110

Wie wechsle ich einfach Spalten mit Zeilen in SQL? Gibt es einen einfachen Befehl zum Transponieren?

dh drehen Sie dieses Ergebnis:

        Paul  | John  | Tim  |  Eric
Red     1       5       1       3
Green   8       4       3       5
Blue    2       2       9       1

das mögen:

        Red  | Green | Blue
Paul    1       8       2
John    5       4       2
Tim     1       3       9
Eric    3       5       1

PIVOT scheint für dieses Szenario zu komplex.

edezzie
quelle
1
stackoverflow.com/questions/10699997/… ist eine ähnliche Frage.
Tim Dearborn

Antworten:

145

Es gibt verschiedene Möglichkeiten, diese Daten zu transformieren. In Ihrem ursprünglichen Beitrag haben Sie angegeben, dass PIVOTdies für dieses Szenario zu komplex erscheint, es jedoch sehr einfach mit den Funktionen UNPIVOTundPIVOT in SQL Server angewendet werden kann .

Wenn Sie jedoch keinen Zugriff auf diese Funktionen haben, kann dies mithilfe von UNION ALLto UNPIVOTund anschließend einer Aggregatfunktion mit der CASEAnweisung to repliziert werden PIVOT:

Tabelle erstellen:

CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);

INSERT INTO yourTable
    ([color], [Paul], [John], [Tim], [Eric])
VALUES
    ('Red', 1, 5, 1, 3),
    ('Green', 8, 4, 3, 5),
    ('Blue', 2, 2, 9, 1);

Union All, Aggregate und CASE Version:

select name,
  sum(case when color = 'Red' then value else 0 end) Red,
  sum(case when color = 'Green' then value else 0 end) Green,
  sum(case when color = 'Blue' then value else 0 end) Blue
from
(
  select color, Paul value, 'Paul' name
  from yourTable
  union all
  select color, John value, 'John' name
  from yourTable
  union all
  select color, Tim value, 'Tim' name
  from yourTable
  union all
  select color, Eric value, 'Eric' name
  from yourTable
) src
group by name

Siehe SQL Fiddle mit Demo

Das UNION ALLführt die UNPIVOTDaten aus, indem die Spalten Paul, John, Tim, Ericin separate Zeilen umgewandelt werden. Anschließend wenden Sie die Aggregatfunktion sum()mit der caseAnweisung an, um die neuen Spalten für jede zu erhalten color.

Unpivot und Pivot Static Version:

Sowohl die UNPIVOTals auch die PIVOTFunktionen in SQL Server erleichtern diese Umwandlung erheblich. Wenn Sie alle Werte kennen, die Sie transformieren möchten, können Sie sie in eine statische Version fest codieren, um das Ergebnis zu erhalten:

select name, [Red], [Green], [Blue]
from
(
  select color, name, value
  from yourtable
  unpivot
  (
    value for name in (Paul, John, Tim, Eric)
  ) unpiv
) src
pivot
(
  sum(value)
  for color in ([Red], [Green], [Blue])
) piv

Siehe SQL Fiddle mit Demo

Die innere Abfrage mit dem hat UNPIVOTdie gleiche Funktion wie die UNION ALL. Es nimmt die Liste der Spalten und PIVOTwandelt sie in Zeilen um. Anschließend führt es die endgültige Umwandlung in Spalten durch.

Dynamische Pivot-Version:

Wenn Sie eine unbekannte Anzahl von Spalten ( Paul, John, Tim, Ericin Ihrem Beispiel) und dann eine unbekannte Anzahl von zu transformierenden Farben haben, können Sie die Liste mit dynamischem SQL generieren UNPIVOTund dann PIVOT:

DECLARE @colsUnpivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('yourtable') and
               C.name <> 'color'
         for xml path('')), 1, 1, '')

select @colsPivot = STUFF((SELECT  ',' 
                      + quotename(color)
                    from yourtable t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select name, '+@colsPivot+'
      from
      (
        select color, name, value
        from yourtable
        unpivot
        (
          value for name in ('+@colsUnpivot+')
        ) unpiv
      ) src
      pivot
      (
        sum(value)
        for color in ('+@colsPivot+')
      ) piv'

exec(@query)

Siehe SQL Fiddle mit Demo

Die dynamische Version fragt sowohl yourtabledie sys.columnsTabelle als auch die Tabelle ab, um die Liste der Elemente für UNPIVOTund zu generieren PIVOT. Dies wird dann zu einer auszuführenden Abfragezeichenfolge hinzugefügt. Das Plus der dynamischen Version ist, wenn Sie eine sich ändernde Liste von haben colorsund / oder namesdie Liste zur Laufzeit generiert wird.

Alle drei Abfragen führen zum gleichen Ergebnis:

| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric |   3 |     5 |    1 |
| John |   5 |     4 |    2 |
| Paul |   1 |     8 |    2 |
|  Tim |   1 |     3 |    9 |
Taryn
quelle
Ich hätte betonen sollen, dass ich eine Methode möchte, um die Ergebnisse einer Abfrage in eine Datenbank zu übertragen. Ein einfacher Befehl vom Typ Transponieren, der für die Ergebnismenge einer Abfrage ausgeführt werden kann, ohne dass Sie etwas über die Abfrage selbst oder die Spalten, Tabellen usw. wissen müssen, aus denen Informationen extrahiert werden. So etwas wie: (TRANSPOSE (SELECT ......)) Stellen Sie sich in meinem obigen Beispiel vor, dass die erste Tabelle eine Ergebnismenge ist, die aus einer sehr komplexen Abfrage generiert wurde, die mehrere Tabellen, Gewerkschaften, Pivots usw. umfasst. Das Ergebnis ist jedoch a einfache Tabelle. Ich möchte in diesem Ergebnis nur die Spalten mit Zeilen umdrehen.
Edezzie
Ich übergebe das Ergebnis an ac # DataTable. Ich kann eine einfache Methode 'Transponieren (Datatable dt)' erstellen, um dies dort zu tun, aber gibt es irgendetwas in SQL, um dies zu tun.
Edezzie
@edezzie Es gibt keine einfache Möglichkeit in SQL, dies zu tun. Sie könnten wahrscheinlich die dynamische Version ändern, um den Tabellennamen zu übergeben und die Informationen aus den Systemtabellen abzurufen.
Taryn
Gibt es einen Grund, warum Sie diese brillante Antwort nicht als ANTWORT gekennzeichnet haben? Gib @bluefeet eine Medaille!
Fandango68
Dies funktioniert einwandfrei. Wählen Sie * aus Tabelle unpivot (Wert für Name in ([Paul], [John], [Tim], [Eric])) bis Pivot (max (Wert) für Farbe in ([Rot], [Grün]). , [Blau])) p, aber es ist möglich, diese Auswahl * aus der Tabelle unpivot (Wert für Name in ([Paul], [John], [Tim], [Eric])) bis Pivot (max (Wert) für color in (SELECT COLOR FROM TABLENAME)) p Anstatt einen Anführungszeichenwert einzugeben, können die Werte nicht direkt mit der Auswahlabfrage abgerufen werden.
Mogli
20

Dies erfordert normalerweise, dass Sie ALLE Spalten- UND Zeilenbeschriftungen im Voraus kennen. Wie Sie in der folgenden Abfrage sehen können, werden alle Beschriftungen sowohl in der UNPIVOT- als auch in der (Neu-) PIVOT-Operation vollständig aufgelistet.

MS SQL Server 2012 Schema-Setup :

create table tbl (
    color varchar(10), Paul int, John int, Tim int, Eric int);
insert tbl select 
    'Red' ,1 ,5 ,1 ,3 union all select
    'Green' ,8 ,4 ,3 ,5 union all select
    'Blue' ,2 ,2 ,9 ,1;

Abfrage 1 :

select *
from tbl
unpivot (value for name in ([Paul],[John],[Tim],[Eric])) up
pivot (max(value) for color in ([Red],[Green],[Blue])) p

Ergebnisse :

| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric |   3 |     5 |    1 |
| John |   5 |     4 |    2 |
| Paul |   1 |     8 |    2 |
|  Tim |   1 |     3 |    9 |

Zusätzliche Bemerkungen:

  1. Wenn Sie einen Tabellennamen angeben , können Sie alle Spaltennamen aus sys.columns oder FOR XML-Tricks mithilfe von local-name () ermitteln .
  2. Sie können die Liste der verschiedenen Farben (oder Werte für eine Spalte) auch mit FOR XML erstellen.
  3. Das Obige kann zu einem dynamischen SQL-Stapel kombiniert werden, um jede Tabelle zu verarbeiten.
RichardTheKiwi
quelle
11

Ich möchte auf einige weitere Lösungen für die Transponierung von Spalten und Zeilen in SQL hinweisen.

Der erste ist - mit CURSOR. Obwohl der allgemeine Konsens in der Fachwelt darin besteht, sich von SQL Server-Cursorn fernzuhalten, gibt es immer noch Fälle, in denen die Verwendung von Cursorn empfohlen wird. Wie auch immer, Cursor bieten uns eine weitere Möglichkeit, Zeilen in Spalten zu transponieren.

  • Vertikale Ausdehnung

    Ähnlich wie beim PIVOT kann der Cursor dynamisch mehr Zeilen anhängen, wenn Ihr Dataset um weitere Richtliniennummern erweitert wird.

  • Horizontale Ausdehnung

    Im Gegensatz zum PIVOT zeichnet sich der Cursor in diesem Bereich aus, da er erweitert werden kann, um neu hinzugefügte Dokumente einzuschließen, ohne das Skript zu ändern.

  • Leistungsaufschlüsselung

    Die Hauptbeschränkung beim Transponieren von Zeilen in Spalten mit CURSOR ist ein Nachteil, der mit der Verwendung von Cursorn im Allgemeinen verbunden ist - sie sind mit erheblichen Leistungskosten verbunden. Dies liegt daran, dass der Cursor für jede FETCH NEXT-Operation eine separate Abfrage generiert.

Eine andere Lösung zum Transponieren von Zeilen in Spalten ist die Verwendung von XML.

Die XML-Lösung zum Transponieren von Zeilen in Spalten ist im Grunde eine optimale Version des PIVOT, da sie die dynamische Spaltenbeschränkung berücksichtigt.

Die XML-Version des Skripts behebt diese Einschränkung durch die Verwendung einer Kombination aus XML-Pfad, dynamischem T-SQL und einigen integrierten Funktionen (z. B. STUFF, QUOTENAME).

  • Vertikale Ausdehnung

    Ähnlich wie bei PIVOT und Cursor können neu hinzugefügte Richtlinien in der XML-Version des Skripts abgerufen werden, ohne das ursprüngliche Skript zu ändern.

  • Horizontale Ausdehnung

    Im Gegensatz zum PIVOT können neu hinzugefügte Dokumente angezeigt werden, ohne das Skript zu ändern.

  • Leistungsaufschlüsselung

    In Bezug auf E / A ähnelt die Statistik der XML-Version des Skripts fast der von PIVOT. Der einzige Unterschied besteht darin, dass die XML-Datei einen zweiten Scan der dtTranspose-Tabelle ausführt, diesmal jedoch aus einem logischen Lesedaten-Cache.

Weitere Informationen zu diesen Lösungen (einschließlich einiger aktueller T-SQL-Beispiele) finden Sie in diesem Artikel: https://www.sqlshack.com/multiple-options-to-transposing-rows-into-columns/

MikeS
quelle
8

Basierend auf dieser Lösung von bluefeet ist hier eine gespeicherte Prozedur, die dynamisches SQL verwendet, um die transponierte Tabelle zu generieren. Es ist erforderlich, dass alle Felder mit Ausnahme der transponierten Spalte (der Spalte, die die Überschrift in der resultierenden Tabelle bildet) numerisch sind:

/****** Object:  StoredProcedure [dbo].[SQLTranspose]    Script Date: 11/10/2015 7:08:02 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Paco Zarate
-- Create date: 2015-11-10
-- Description: SQLTranspose dynamically changes a table to show rows as headers. It needs that all the values are numeric except for the field using for     transposing.
-- Parameters: @TableName - Table to transpose
--             @FieldNameTranspose - Column that will be the new headers
-- Usage: exec SQLTranspose <table>, <FieldToTranspose>
-- =============================================
ALTER PROCEDURE [dbo].[SQLTranspose] 
  -- Add the parameters for the stored procedure here
  @TableName NVarchar(MAX) = '', 
  @FieldNameTranspose NVarchar(MAX) = ''
AS
BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;

  DECLARE @colsUnpivot AS NVARCHAR(MAX),
  @query  AS NVARCHAR(MAX),
  @queryPivot  AS NVARCHAR(MAX),
  @colsPivot as  NVARCHAR(MAX),
  @columnToPivot as NVARCHAR(MAX),
  @tableToPivot as NVARCHAR(MAX), 
  @colsResult as xml

  select @tableToPivot = @TableName;
  select @columnToPivot = @FieldNameTranspose


  select @colsUnpivot = stuff((select ','+quotename(C.name)
       from sys.columns as C
       where C.object_id = object_id(@tableToPivot) and
             C.name <> @columnToPivot 
       for xml path('')), 1, 1, '')

  set @queryPivot = 'SELECT @colsResult = (SELECT  '','' 
                    + quotename('+@columnToPivot+')
                  from '+@tableToPivot+' t
                  where '+@columnToPivot+' <> ''''
          FOR XML PATH(''''), TYPE)'

  exec sp_executesql @queryPivot, N'@colsResult xml out', @colsResult out

  select @colsPivot = STUFF(@colsResult.value('.', 'NVARCHAR(MAX)'),1,1,'')

  set @query 
    = 'select name, rowid, '+@colsPivot+'
        from
        (
          select '+@columnToPivot+' , name, value, ROW_NUMBER() over (partition by '+@columnToPivot+' order by '+@columnToPivot+') as rowid
          from '+@tableToPivot+'
          unpivot
          (
            value for name in ('+@colsUnpivot+')
          ) unpiv
        ) src
        pivot
        (
          sum(value)
          for '+@columnToPivot+' in ('+@colsPivot+')
        ) piv
        order by rowid'
  exec(@query)
END

Sie können es mit der mit diesem Befehl bereitgestellten Tabelle testen:

exec SQLTranspose 'yourTable', 'color'
Paco Zarate
quelle
argg. aber ich möchte eines, bei dem alle Felder nvarchar (max) sind
hamish
1
Für alle Felder nvarchar (max) ändern Sie einfach die Summe (Wert) mit max (Wert) in der 6. Zeile vom Ende
Paco Zarate
2

Ich mache UnPivotzuerst und speichere die Ergebnisse in CTEund verwende die CTEIn- PivotOperation.

Demo

with cte as
(
select 'Paul' as Name, color, Paul as Value 
 from yourTable
 union all
 select 'John' as Name, color, John as Value 
 from yourTable
 union all
 select 'Tim' as Name, color, Tim as Value 
 from yourTable
 union all
 select 'Eric' as Name, color, Eric as Value 
 from yourTable
 )

select Name, [Red], [Green], [Blue]
from
(
select *
from cte
) as src
pivot 
(
  max(Value)
  for color IN ([Red], [Green], [Blue])
) as Dtpivot;
Vishwanath Dalvi
quelle
2

Wenn Sie zu @Paco Zarates großartiger Antwort oben hinzufügen möchten, wenn Sie eine Tabelle mit mehreren Spaltentypen transponieren möchten, fügen Sie diese am Ende von Zeile 39 hinzu, sodass nur intSpalten transponiert werden :

and C.system_type_id = 56   --56 = type int

Hier ist die vollständige Abfrage, die geändert wird:

select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id(@tableToPivot) and
      C.name <> @columnToPivot and C.system_type_id = 56    --56 = type int
for xml path('')), 1, 1, '')

system_type_idFühren Sie Folgendes aus, um andere zu finden :

select name, system_type_id from sys.types order by name
Jonathan Harris
quelle
1

Ich teile gerne den Code, den ich verwende, um einen geteilten Text basierend auf der + Bluefeet-Antwort zu transponieren. In diesem Ansatz bin ich als Prozedur in MS SQL 2005 implementiert

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      ELD.
-- Create date: May, 5 2016.
-- Description: Transpose from rows to columns the user split function.
-- =============================================
CREATE PROCEDURE TransposeSplit @InputToSplit VARCHAR(8000)
    ,@Delimeter VARCHAR(8000) = ','
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @colsUnpivot AS NVARCHAR(MAX)
        ,@query AS NVARCHAR(MAX)
        ,@queryPivot AS NVARCHAR(MAX)
        ,@colsPivot AS NVARCHAR(MAX)
        ,@columnToPivot AS NVARCHAR(MAX)
        ,@tableToPivot AS NVARCHAR(MAX)
        ,@colsResult AS XML

    SELECT @tableToPivot = '#tempSplitedTable'

    SELECT @columnToPivot = 'col_number'

    CREATE TABLE #tempSplitedTable (
        col_number INT
        ,col_value VARCHAR(8000)
        )

    INSERT INTO #tempSplitedTable (
        col_number
        ,col_value
        )
    SELECT ROW_NUMBER() OVER (
            ORDER BY (
                    SELECT 100
                    )
            ) AS RowNumber
        ,item
    FROM [DB].[ESCHEME].[fnSplit](@InputToSplit, @Delimeter)

    SELECT @colsUnpivot = STUFF((
                SELECT ',' + quotename(C.NAME)
                FROM [tempdb].sys.columns AS C
                WHERE C.object_id = object_id('tempdb..' + @tableToPivot)
                    AND C.NAME <> @columnToPivot
                FOR XML path('')
                ), 1, 1, '')

    SET @queryPivot = 'SELECT @colsResult = (SELECT  '','' 
                    + quotename(' + @columnToPivot + ')
                  from ' + @tableToPivot + ' t
                  where ' + @columnToPivot + ' <> ''''
          FOR XML PATH(''''), TYPE)'

    EXEC sp_executesql @queryPivot
        ,N'@colsResult xml out'
        ,@colsResult OUT

    SELECT @colsPivot = STUFF(@colsResult.value('.', 'NVARCHAR(MAX)'), 1, 1, '')

    SET @query = 'select name, rowid, ' + @colsPivot + '
        from
        (
          select ' + @columnToPivot + ' , name, value, ROW_NUMBER() over (partition by ' + @columnToPivot + ' order by ' + @columnToPivot + ') as rowid
          from ' + @tableToPivot + '
          unpivot
          (
            value for name in (' + @colsUnpivot + ')
          ) unpiv
        ) src
        pivot
        (
          MAX(value)
          for ' + @columnToPivot + ' in (' + @colsPivot + ')
        ) piv
        order by rowid'

    EXEC (@query)

    DROP TABLE #tempSplitedTable
END
GO

Ich mische diese Lösung mit den Informationen zum Ordnen von Zeilen ohne Reihenfolge nach ( SQLAuthority.com ) und der Aufteilungsfunktion auf MSDN ( social.msdn.microsoft.com ).

Wenn Sie die Prozedur ausführen

DECLARE @RC int
DECLARE @InputToSplit varchar(MAX)
DECLARE @Delimeter varchar(1)

set @InputToSplit = 'hello|beautiful|world'
set @Delimeter = '|'

EXECUTE @RC = [TransposeSplit] 
   @InputToSplit
  ,@Delimeter
GO

Sie erhalten das nächste Ergebnis

  name       rowid  1      2          3
  col_value  1      hello  beautiful  world
Elidio Marquina
quelle
1

Auf diese Weise konvertieren Sie alle Daten aus Filelds (Spalten) in Tabelle in Datensatz (Zeile).

Declare @TableName  [nvarchar](128)
Declare @ExecStr    nvarchar(max)
Declare @Where      nvarchar(max)
Set @TableName = 'myTableName'
--Enter Filtering If Exists
Set @Where = ''

--Set @ExecStr = N'Select * From '+quotename(@TableName)+@Where
--Exec(@ExecStr)

Drop Table If Exists #tmp_Col2Row

Create Table #tmp_Col2Row
(Field_Name nvarchar(128) Not Null
,Field_Value nvarchar(max) Null
)

Set @ExecStr = N' Insert Into #tmp_Col2Row (Field_Name , Field_Value) '
Select @ExecStr += (Select N'Select '''+C.name+''' ,Convert(nvarchar(max),'+quotename(C.name) + ') From ' + quotename(@TableName)+@Where+Char(10)+' Union All '
         from sys.columns as C
         where (C.object_id = object_id(@TableName)) 
         for xml path(''))
Select @ExecStr = Left(@ExecStr,Len(@ExecStr)-Len(' Union All '))
--Print @ExecStr
Exec (@ExecStr)

Select * From #tmp_Col2Row
Go
Mahmood Khezrian
quelle
0

Ich konnte die Lösung von Paco Zarate verwenden und sie funktioniert wunderbar. Ich musste eine Zeile hinzufügen ("SET ANSI_WARNINGS ON"), aber das kann etwas Einzigartiges sein, wie ich es verwendet oder genannt habe. Es gibt ein Problem mit meiner Verwendung und ich hoffe, jemand kann mir dabei helfen:

Die Lösung funktioniert nur mit einer tatsächlichen SQL-Tabelle. Ich habe es mit einer temporären Tabelle und einer speicherinternen (deklarierten) Tabelle versucht, aber mit diesen funktioniert es nicht. In meinem Aufrufcode erstelle ich eine Tabelle in meiner SQL-Datenbank und rufe dann SQLTranspose auf. Wieder funktioniert es großartig. Es ist genau das, was ich will. Hier ist mein Problem:

Damit die Gesamtlösung wirklich dynamisch ist, muss ich diese Tabelle erstellen, in der ich die vorbereiteten Informationen, die ich "on the fly" an SQLTranspose sende, vorübergehend speichere und diese Tabelle dann lösche, sobald SQLTranspose aufgerufen wird. Das Löschen der Tabelle stellt ein Problem mit meinem endgültigen Implementierungsplan dar. Der Code muss von einer Endbenutzeranwendung ausgeführt werden (eine Schaltfläche in einem Microsoft Access-Formular / -Menü). Wenn ich diesen SQL-Prozess verwende (SQL-Tabelle erstellen, SQLTranspose aufrufen, SQL-Tabelle löschen), tritt bei der Endbenutzeranwendung ein Fehler auf, da das verwendete SQL-Konto nicht zum Löschen einer Tabelle berechtigt ist.

Ich denke, es gibt einige mögliche Lösungen:

  1. Finden Sie eine Möglichkeit, SQLTranspose mit einer temporären Tabelle oder einer deklarierten Tabellenvariablen arbeiten zu lassen.

  2. Finden Sie eine andere Methode für die Transposition von Zeilen und Spalten heraus, für die keine tatsächliche SQL-Tabelle erforderlich ist.

  3. Finden Sie eine geeignete Methode heraus, mit der das von meinen Endbenutzern verwendete SQL-Konto eine Tabelle löschen kann. Es ist ein einzelnes freigegebenes SQL-Konto, das in meiner Access-Anwendung codiert ist. Es scheint, dass die Berechtigung ein Privileg vom Typ dbo ist, das nicht gewährt werden kann.

Ich erkenne, dass einige davon einen anderen, separaten Thread und eine andere Frage rechtfertigen können. Da es jedoch die Möglichkeit gibt, dass eine Lösung einfach eine andere Methode zum Transponieren von Zeilen und Spalten ist, werde ich hier in diesem Thread meinen ersten Beitrag verfassen.

EDIT: Ich habe auch die Summe (Wert) durch max (Wert) in der 6. Zeile vom Ende ersetzt, wie Paco vorgeschlagen hat.

BEARBEITEN:

Ich habe etwas herausgefunden, das für mich funktioniert. Ich weiß nicht, ob es die beste Antwort ist oder nicht.

Ich habe ein schreibgeschütztes Benutzerkonto, mit dem gestresste Prozeduren ausgeführt werden und daher Berichtsausgaben aus einer Datenbank generiert werden. Da die von mir erstellte SQLTranspose-Funktion nur mit einer "legitimen" Tabelle (keine deklarierte Tabelle und keine temporäre Tabelle) funktioniert, musste ich herausfinden, wie ein schreibgeschütztes Benutzerkonto eine Tabelle erstellen (und später löschen) kann .

Ich habe festgestellt, dass es für meine Zwecke in Ordnung ist, dass das Benutzerkonto eine Tabelle erstellen darf. Der Benutzer konnte die Tabelle jedoch immer noch nicht löschen. Meine Lösung bestand darin, ein Schema zu erstellen, in dem das Benutzerkonto autorisiert ist. Wenn ich diese Tabelle dann erstelle, verwende oder lösche, verweise ich sie mit dem angegebenen Schema.

Ich habe diesen Befehl zuerst von einem 'sa'- oder' sysadmin'-Konto aus ausgegeben: CREATE SCHEMA ro AUTHORIZATION

Wenn ich auf meine "tmpoutput" -Tabelle verweise, gebe ich sie wie folgt an:

drop table ro.tmpoutput

CraigD
quelle
Ich habe etwas herausgefunden, das für mich funktioniert. Ich weiß nicht, ob es die beste Antwort ist oder nicht.
CraigD