我需要编写一个SQL函数来返回列特定的值,所以我将列名作为参数传递给SQL-function以返回其相应的值。下面是示例函数
CREATE FUNCTION GETDATETIME(@columnName VARCHAR(100))
RETURNS DATETIME
AS
BEGIN
RETURN (SELECT TOP 1.@columnName FROM TEST_TABLE )
END
GO上面的函数似乎是直接的,但它不像预期的那样工作。当我执行这个函数时
SELECT dbo.GETDATETIME('DATETIMECOLUMNNAME')我得到了这个错误:
从字符串转换日期和/或时间时,转换失败。
有人能帮我找出这个问题吗?
发布于 2019-07-26 06:10:06
发布于 2019-07-26 06:03:25
为此,您需要编写动态sql。但是函数不支持execute语句。
因此,您需要为每个列编写多个If条件。
CREATE FUNCTION GETDATETIME(@columnName VARCHAR(100))
RETURNS DATETIME
AS
BEGIN
DECLARE @RESULT DATETIME;
IF (@columnName = 'ABC')
Begin
SELECT TOP 1 @RESULT = [ABC] FROM TEST_TABLE
END
ELSE IF (@columnName = 'DEF')
Begin
SELECT TOP 1 @RESULT = [DEF] FROM TEST_TABLE
END
ELSE IF (@columnName = 'GHI')
Begin
SELECT TOP 1 @RESULT = [GHI] FROM TEST_TABLE
END
RETURN @RESULT
END
GO编辑2:如果您的列总是返回日期时间,那么您可以像下面这样做。
CREATE TABLE A_DUM (ID INT, STARTDATE DATETIME, ENDDATE DATETIME, MIDDLEDATE DATETIME)
INSERT INTO A_DUM
SELECT 1, '2019-07-24 11:35:58.910', '2019-07-28 11:35:58.910', '2019-07-26 11:35:58.910'
UNION ALL
SELECT 2, '2019-07-29 11:35:58.910', '2019-08-01 11:35:58.910', '2019-07-24 11:35:58.910'你的功能如下
CREATE FUNCTION GETDATETIME(@columnName VARCHAR(100))
RETURNS DATETIME
AS
BEGIN
DECLARE @RESULT DATETIME;
SELECT TOP 1 @RESULT = CAST(PROP AS DATETIME)
FROM A_DUM
UNPIVOT
(
PROP FOR VAL IN (STARTDATE, ENDDATE,MIDDLEDATE)
)UP
WHERE VAL = @columnName
RETURN @RESULT
END
GO发布于 2022-01-21 02:52:14
这里有一个解决办法,类似于@Shakeer的回答--如果您试图按列名分组或对列名执行WHERE,则只需使用CASE语句创建一个子句来匹配特定的列名(如果您知道的话)。
显然,如果您有很多列要硬编码,这并不是很好的工作,但至少这是实现一般想法的一种方法。
例如,用WHERE条款:
WHERE
(CASE
WHEN @columnname = 'FirstColumn' THEN FirstColumnCondition
WHEN @columnname = 'SecondColumn' THEN SecondColumnCondition
ELSE SomeOtherColumnCondition
END)或由下列团体组成:
GROUP BY
(CASE
WHEN @columnname = 'FirstColumn' THEN FirstColumnGroup
WHEN @columnname = 'SecondColumn' THEN SecondColumnGroup
ELSE SomeOtherColumnGroup
END)https://stackoverflow.com/questions/57213849
复制相似问题