DataType und Größe der Spalte aus SQL Server-Abfrageergebnissen zur Laufzeit anzeigen

9

Gibt es eine Möglichkeit, eine Abfrage auszuführen und dann SQL Server Management Studio oder sqlcmd oder etwas einfach den Datentyp und die Größe jeder Spalte anzuzeigen, wie sie empfangen wurde.

Scheint so, als ob diese Information vorhanden sein muss, damit die Daten zwischen dem Server und dem Client übertragen werden können. Es wäre sehr hilfreich für mich, wenn es angezeigt werden könnte.

Ein kleiner Hintergrund: Der Grund, warum ich frage, ist, weil ich mit zahllosen veralteten Stored Procedures mit mehr als 50 bis mehr als 5000 Codezeilen interagieren muss. Ich möchte nicht versuchen müssen, den kryptischen Logikfluss innerhalb und außerhalb von temporären Tabellen, in andere Prozeduren, in string-verkettete Evaluierungsanweisungen usw. zu verfolgen. Ich möchte keine Kenntnisse über die Implementierung behalten, einfach was zu erwarten ist, wenn sie arbeiten. Unglücklicherweise scheint der Logikfluss der einzige Weg zu sein, herauszufinden, was genau zurückgegeben wird, ohne zu versuchen, daraus abzuleiten, was die tatsächlichen Typen der Datenstring-Repräsentation in Management Studio oder dem nativen Typ in .net sind.

>

Zur Verdeutlichung: Ich frage nicht, wie man die Typen einer Tabelle oder etwas Statisches so sagen kann. Ich bin mir ziemlich sicher, dass etwas wie sp_help mir nicht helfen wird. Ich frage, wie man sagt, was die SQL-Server-Typen (dh varchar (25), int ...) von dem sind, was mir gegeben wurde. Außerdem ist es nicht möglich, die Implementierung der Sprocs zu ändern. Bitte beachten Sie dies bei Ihren Lösungen. Ich hoffe wirklich, dass es einen Befehl gibt, den ich irgendwo verpasst habe. Vielen Dank an alle.

Aktualisieren Ich denke, was ich wirklich frage, ist, wie man das Schema der Ergebnismenge erhält, wenn die Ergebnismenge von einer Abfrage stammt, die eine temporäre Tabelle verwendet. Ich verstehe das als unmöglich, finde aber mit dieser Schlussfolgerung keinen Sinn, weil die Daten doch übertragen werden. Hier ist ein Beispiel für eine gespeicherte Prozedur, die ein Problem verursachen würde.

%Vor%     
Blake Taylor 22.06.2009, 19:21
quelle

5 Antworten

2

Was tun Sie mit gespeicherten Prozeduren, die auf Basis ihrer Parameter unterschiedliche Ergebnismengen zurückgeben?

In jedem Fall können Sie einen SqlDataAdapter.SelectCommand zusammen mit den erforderlichen Parametern konfigurieren und dann die FillSchema-Methode aufrufen. Unter der Annahme, dass das Schema bestimmt werden kann, erhalten Sie eine DataTable, die mit korrekten Spaltennamen und -typen sowie einigen Einschränkungen konfiguriert ist.

    
John Saunders 22.06.2009 19:29
quelle
2

Ein bisschen eine lange Einstellung, versuchen Sie es mit SET FMTONLY ON (oder aus) herumspielen. Laut BOL, diese "Gibt nur Metadaten an den Client. Kann verwendet werden, um das Format der Antwort zu testen, ohne die Abfrage tatsächlich auszuführen." Ich vermute, dass dies genau das beinhaltet, wonach Sie suchen, da BCP dies verwendet. (Ich bin über diese Einstellung gestolpert, als ich einige sehr seltsame BCP-Probleme debugging.)

    
Philip Kelley 22.06.2009 19:52
quelle
1

Könnten Sie eine weitere -Auswahl an Ihre Prozedur anhängen?

Wenn dies der Fall ist, können Sie dies mithilfe der Funktion sql_variant_property tun.

%Vor%

Ich habe das auf hier gepostet Frage.

  

Ich frage, wie man sagt, was der Sql   Servertypen (zB varchar (25), int ...)   sind von dem, was mir gegeben wurde

Sie könnten dann den Typ, die Genauigkeit (d. h. 25, falls VarChar (25)) und die Skalierung des Parameters ausdrucken.

Ich hoffe, das hilft ... :)

    
user110714 22.06.2009 19:33
quelle
0

Wenn Sie nicht auf T-SQL beschränkt sind und es Ihnen offensichtlich nichts ausmacht, die SPs auszuführen (weil SET FMTONLY ON nicht vollständig zuverlässig ist), rufen Sie definitiv CAN die SPs ab, sage C # mit SqlDataReader . Überprüfen Sie dann SqlDataReader , um die Spalten und die Datentypen zu erhalten. Sie können auch mehrere Ergebnismengen haben. Sie können auch einfach aus dieser Umgebung zur nächsten Ergebnismenge gehen.

    
Cade Roux 22.06.2009 20:43
quelle
0

Dieser Code sollte dich reparieren. Es wird nur ein Dataset ohne Schema ohne Datensätze zurückgegeben. Sie können dieses Dataset verwenden, um den DataType der Spalten und andere Metadaten abzufragen. Wenn Sie möchten, können Sie später das DataSet mit Datensätzen auffüllen, indem Sie einen SqlDataAdapter erstellen und die Methode Fill (IDataAdapter.Fill) aufrufen.

%Vor%     
John C 28.04.2015 22:23
quelle