在用户定义的函数中返回列名而不是值 SQL
Posted
技术标签:
【中文标题】在用户定义的函数中返回列名而不是值 SQL【英文标题】:Return Column Name in User Defined function instead of Value SQL 【发布时间】:2013-02-28 08:43:55 【问题描述】:我有一个表,其中有 40 多列都存储在 varchar 中。某些列也包含数字或日期的数据。
我有一个用户定义的函数,它将列名和数据类型作为参数,并尝试验证列中的数据。
如果验证失败,它应该返回一条消息说“列名不是数字或缺失”。但是它返回“值不是数字或缺失”。
函数代码为:
create function [dbo].[fn_Polaris_Validate_Staging_Data](@ColumnName varchar(max), @TargetValidation varchar(max))
returns varchar(max)
AS
Begin
Declare @Remark varchar(max);
if(@TargetValidation = 'Standard' and @ColumnName is null)
BEGIN
select @Remark = @ColumnName + ' is not provided.'
return @Remark
END
if(@TargetValidation = 'NumericType' and ISNUMERIC(@ColumnName) = 0)
BEGIN
select @Remark = @ColumnName + ' is not numeric or not provided.'
return @Remark
END
if(@TargetValidation = 'DateType' and ISDATE(@ColumnName) = 0)
BEGIN
select @Remark = @ColumnName + ' is not proper date or not provided.'
return @Remark
END
return isnull(@Remark, '')
END
我的表中有一个名为“备注”的列,用于保存此备注。这是我在更新查询中使用此函数的方式:
UPDATE TABLE TABLE1
SET remarks = isnull(remarks,'') +
function(Interest, 'NumericType') +
function(Asset, 'Standard') +
function(Date, 'DateType')
任何帮助将不胜感激。 谢谢。
【问题讨论】:
【参考方案1】:使用ISNUMERIC(@variable)
仅适用于该@variable 的字符串内容,它不会引用字符串中的任何列名。
declare @col as varchar(max)
set @col = '1'
select ISNUMERIC(@col)
= 1
declare @col as varchar(max)
set @col = 'table.id'
select ISNUMERIC(@col)
= 0 - regardless of the type of table.id
也许这会有用?
SELECT DATA_TYPE FROM information_schema.columns
WHERE Table_Name='mytable' and Column_Name='mycolname'
【讨论】:
我的意思是说所有数据实际上都存储在 varchar (max) 中,但是列的数据就像 '123.23' (存储在 varchar 中的数字数据)和 '02/18/2013' ( varchar 中存储的日期数据)。 除非您以某种方式严格执行它,否则给定的列可能包含数字或文本……除非您检查特定行,否则 SQL 无法判断。您可以 SELECT TOP 1 (MS SQL) 获取第一行,然后检查其中的内容...?也许您最好将表和列定义存储在某个地方... 我正在使用 SSIS 从 CSV 文件中加载所有数据,并将所有内容最初保存为 varchar。之后,我清理 SQL 中的数据。以上是关于在用户定义的函数中返回列名而不是值 SQL的主要内容,如果未能解决你的问题,请参考以下文章
Laravel DB 选择语句。查询返回列名作为结果而不是值
如何在 SQL Server 中获取用户定义的表值函数的结果形状? [复制]