Re: SQL 2000 CREATE FUNCTION
- From: "Elmar Boye" <ElmarB@xxxxxxx>
- Date: Wed, 19 Jul 2006 11:49:14 +0200
Hallo Lutz,
Lutz Elßner <www.vb-hosting.de> schrieb ...
Ich hätte gerne eine auf dem SQL Server 2000 gespeicherte Function,
die als Parameter einen Tabellennamen bekommt und einen varchar
zurück gibt, in dem alle Spaltennamen dieser Tabelle durch Komma
getrennt drin stehen.
Prinzipiell wie unten angeführt.
Allerdings solltest Du immer sysname (Unicode) verwenden.
Und es gibt bei der Funktion Probleme, wenn die Länge mehr
als die maximal möglichen 4000 Zeichen umfasst.
sp_columns ist schon ein guter Anfang, aber "for each" in SQL Syntax
habe ich nie verstanden und das lohnt sich nun auch nicht mehr...
Ich würde dort keine SQL Funktion verwenden, sondern direkt
INFORMATION_SCHEMA.COLUMNS abrufen und das Verknüpfen
(for each) innerhalb einer (VB.)NET Funktion erledigen, z. B.:
///
Public Shared Function GetColumnList( _
ByVal connectionString As String, _
ByVal tableName As String) As String
' Mit Standardschema
Return GetColumnList(connectionString, Nothing, tableName)
End Function
Public Shared Function GetColumnList( _
ByVal connectionString As String, _
ByVal tableSchema As String, _
ByVal tableName As String) As String
Dim connection As New SqlConnection(connectionString)
' dbo als Standardschema
If tableSchema Is Nothing OrElse tableSchema.Length = 0 Then
tableSchema = "dbo"
End If
If tableName Is Nothing Then
Throw New ArgumentNullException("tableName")
End If
Dim command As New SqlCommand("SELECT COLUMN_NAME " & _
"FROM INFORMATION_SCHEMA.COLUMNS " & _
"WHERE TABLE_SCHEMA = @TableSchema AND TABLE_NAME = @TableName", connection)
command.Parameters.Add("@TableSchema", SqlDbType.NVarChar, 128).Value = tableSchema
command.Parameters.Add("@TableName", SqlDbType.NVarChar, 128).Value = tableName
Dim columns As New System.Text.StringBuilder()
connection.Open()
Try
Dim dataReader As SqlDataReader = command.ExecuteReader(CommandBehavior.SequentialAccess)
Do While dataReader.Read()
If columns.Length > 0 Then
columns.Append(", ")
End If
columns.Append(dataReader.GetString(0))
Loop
dataReader.Close()
Finally
connection.Dispose()
End Try
Return columns.ToString()
End Function
\\\
Vielleicht gibt es auch eine Systemfunktion, denn aus einem * die
Spaltennamen machen, das muss der SQL Server ja ständig um leben zu
können.
Nein. Denn schliesslich kann der "*" in Verbindung im JOIN für
die Spalten vieler Tabellen stehen.
Gruss
Elmar
--
-- Die Prozedurvariante:
CREATE FUNCTION dbo.GetColumnList
(
@TableSchema sysname = N'dbo',
@TableName sysname
)
RETURNS nvarchar(4000)
AS
BEGIN
DECLARE @columns nvarchar(4000)
IF @TableSchema IS NULL
SET @TableSchema = N'dbo'
SET @columns = N''
SELECT @columns = @columns + COLUMN_NAME + N', '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @TableSchema
AND TABLE_NAME = @TableName
ORDER BY ORDINAL_POSITION
IF LEN(@columns) > 0
SET @columns = SUBSTRING(@columns, 1, LEN(@columns) - 1)
RETURN @columns
END
GO
GRANT EXECUTE ON dbo.GetColumnList TO public
GO
SELECT dbo.GetColumnList(DEFAULT, N'Orders')
GO
.
- Follow-Ups:
- Re: SQL 2000 CREATE FUNCTION
- From: Lutz Elßner
- Re: SQL 2000 CREATE FUNCTION
- References:
- SQL 2000 CREATE FUNCTION
- From: Lutz Elßner
- SQL 2000 CREATE FUNCTION
- Prev by Date: Re: INSERT in .DBF mit AutoInc Feld
- Next by Date: Re: Firebird Provider 2.0(final)
- Previous by thread: SQL 2000 CREATE FUNCTION
- Next by thread: Re: SQL 2000 CREATE FUNCTION
- Index(es):
Relevant Pages
|
|