首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL server函数-以列名作为输入参数

SQL server函数-以列名作为输入参数
EN

Stack Overflow用户
提问于 2019-07-26 05:49:48
回答 3查看 4.2K关注 0票数 1

我需要编写一个SQL函数来返回列特定的值,所以我将列名作为参数传递给SQL-function以返回其相应的值。下面是示例函数

代码语言:javascript
运行
复制
CREATE FUNCTION GETDATETIME(@columnName VARCHAR(100)) 
RETURNS DATETIME
AS 
BEGIN
    RETURN (SELECT TOP 1.@columnName  FROM TEST_TABLE ) 
END
GO

上面的函数似乎是直接的,但它不像预期的那样工作。当我执行这个函数时

代码语言:javascript
运行
复制
SELECT dbo.GETDATETIME('DATETIMECOLUMNNAME')

我得到了这个错误:

从字符串转换日期和/或时间时,转换失败。

有人能帮我找出这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-26 06:10:06

不,不能在SQL中的函数中使用动态sql。请查看此链接以获得更多信息链接

因此,不可能通过任何函数来实现这一点,是的,您可以使用带有输出参数的存储过程。

您可以找到此链接,以供参考,链接

票数 1
EN

Stack Overflow用户

发布于 2019-07-26 06:03:25

为此,您需要编写动态sql。但是函数不支持execute语句。

因此,您需要为每个列编写多个If条件。

代码语言:javascript
运行
复制
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:如果您的列总是返回日期时间,那么您可以像下面这样做。

代码语言:javascript
运行
复制
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'

你的功能如下

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2022-01-21 02:52:14

这里有一个解决办法,类似于@Shakeer的回答--如果您试图按列名分组或对列名执行WHERE,则只需使用CASE语句创建一个子句来匹配特定的列名(如果您知道的话)。

显然,如果您有很多列要硬编码,这并不是很好的工作,但至少这是实现一般想法的一种方法。

例如,用WHERE条款:

代码语言:javascript
运行
复制
WHERE
(CASE 
  WHEN @columnname = 'FirstColumn' THEN FirstColumnCondition
  WHEN @columnname = 'SecondColumn' THEN SecondColumnCondition
  ELSE SomeOtherColumnCondition
  END)

或由下列团体组成:

代码语言:javascript
运行
复制
GROUP BY
(CASE 
  WHEN @columnname = 'FirstColumn' THEN FirstColumnGroup
  WHEN @columnname = 'SecondColumn' THEN SecondColumnGroup
  ELSE SomeOtherColumnGroup
  END)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57213849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档