我创建了这个 SP,它动态创建一个列列表并将所有具有 Datetime 和 Date 数据类型的列转换为 dd-mm-yyyy。至少它有助于手动编写大量转换。
CREATE PROCEDURE usp_ColumnToStringDate(@p_TableName SYSNAME, @p_FilterString VARCHAR(4000) = NULL)
AS
BEGIN
SET NOCOUNT ON
DECLARE @TableName SYSNAME
DECLARE @ColumnName SYSNAME
DECLARE @SchemaName SYSNAME
DECLARE @DataType SYSNAME
DECLARE @StartLoop INT
DECLARE @EndLoop INT
DECLARE @SQLColumnList VARCHAR(4000)
DECLARE @SQL VARCHAR(4000)
DECLARE @FilterString VARCHAR(4000)
SET @TableName = @p_TableName
SET @FilterString = @p_FilterString
DECLARE @TargetTable TABLE (
OrderID INT IDENTITY(1, 1),
TableSchema SYSNAME,
TableName SYSNAME,
ColumnName SYSNAME,
DataType SYSNAME
)
INSERT INTO @TargetTable
SELECT QUOTENAME(c.TABLE_SCHEMA),
QUOTENAME(c.TABLE_NAME),
QUOTENAME(c.COLUMN_NAME),
UPPER(c.DATA_TYPE)
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_NAME = @TableName
ORDER BY c.ORDINAL_POSITION
--SELECT * FROM @TargetTable
SELECT @StartLoop = MIN(tt.OrderID),
@EndLoop = MAX(tt.OrderID),
@SchemaName = MIN(tt.TableSchema),
@TableName = MIN(tt.TableName)
FROM @TargetTable tt
WHILE @StartLoop <= @EndLoop
BEGIN
SELECT @DataType = tt.DataType,
@ColumnName = tt.ColumnName
FROM @TargetTable tt
WHERE tt.OrderID = @StartLoop
--PRINT @ColumnName+' '+@DataType
SET @SQLColumnList = ISNULL(@SQLColumnList, '')
+ CASE
WHEN @DataType IN ('DATETIME', 'DATE') THEN CHAR(9) + CHAR(9)
+ 'CONVERT(VARCHAR(10),' + @ColumnName + ', 105)'
ELSE CHAR(9) + CHAR(9) + @ColumnName
END
IF @StartLoop != @EndLoop
BEGIN
SET @SQLColumnList = @SQLColumnList + ',' + CHAR(13) + CHAR(10)
END
IF @StartLoop = 1
BEGIN
SET @SQLColumnList = 'SELECT' + REPLACE(@SQLColumnList, CHAR(9), ' ')
END
SET @StartLoop = @StartLoop + 1
END
SET @SQL = @SQLColumnList + CHAR(13) + CHAR(10) + 'FROM ' + @TableName + CHAR(13) + CHAR(10)
SET @SQL = COALESCE(@SQL+@FilterString,@SQL)
PRINT @SQL
END
用法:
--SELECT Statement
EXEC usp_ColumnToStringDate 'ProductListPriceHistory',NULL
--SELECT Statement with Filter
EXEC usp_ColumnToStringDate 'ProductListPriceHistory','WHERE ProductID = ''1'''
--Use in other SP or assign to parameters
DECLARE @DSQL VARCHAR(MAX)
EXEC @DSQL = usp_ColumnToStringDate 'ProductListPriceHistory','WHERE ProductID = ''1'''
PRINT REVERSE(SUBSTRING(REVERSE(@DSQL),2,LEN(@DSQL)))