sql server - 将不带引号的常量传递给 DATEPART 等函数

发布于 2024-07-24 22:38:30 字数 344 浏览 5 评论 0原文

我想创建一个接受常量的函数,例如 datepart 函数接受 yy/mm/dd/hh/ ,

如下所示:

选择日期部分(dd, getdate())

我想创建自己的接受 dd 的函数 像 'dd' 这样的字符

不是我想要的

选择 MyFunc(dd, getdate())

而不是

选择 MyFunc('dd', getdate())

i would like to create a function which accepts a constant like
the datepart function accepts yy/mm/dd/hh/

like:

select datepart(dd, getdate())

i would like to create my own function that accepts dd
not char like 'dd'

i want

select MyFunc(dd, getdate())

and not

select MyFunc('dd', getdate())

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

护你周全 2024-07-31 22:38:30

您无法真正将 UDF 的输入限制为一小组值(据我所知)。

我建议为您的枚举值创建一个表格 - 像这样:

CREATE TABLE MyEnumTable (DatePartID tinyint, DatePartValue char(2))
GO
INSERT MyEnumTable(DatePartID, DatePartValue)
SELECT 1, 'yy'
UNION
SELECT 2, 'mm'
UNION
SELECT 3, 'dd'
UNION
SELECT 4, 'hh'
GO

CREATE FUNCTION MyDatePart(@IntervalType tinyint)
RETURNS varchar(255)
AS
BEGIN
IF NOT EXISTS (SELECT * FROM MyEnumTable WHERE DatePartID = @IntervalType)
   RETURN 'Invalid IntervalType'

--Do your stuff
DECLARE @DatePartvalue char(2)
SELECT  @DatePartValue = DatePartValue
FROM    MyEnumTable
WHERE   DatePartID = @IntervalType

RETURN @DatePartValue
END

GO

--Check it out
SELECT dbo.MyDatePart(3), dbo.MyDatePart(12)

当然,我的示例过于简单,但您明白了。

另外,如果您计划在 set 语句中使用 udf,则出于性能原因,请考虑将该函数设为表值函数。 我在博客中介绍了各种函数类型的性能影响:

http://thehobt.blogspot.com/2009/02/scalar-functions-vs-table-valued.html

You can't really constrain the input of a UDF to a small set of values (to the best of my knowledge).

I would recommend creating a tabe for your enumerated values - something like this:

CREATE TABLE MyEnumTable (DatePartID tinyint, DatePartValue char(2))
GO
INSERT MyEnumTable(DatePartID, DatePartValue)
SELECT 1, 'yy'
UNION
SELECT 2, 'mm'
UNION
SELECT 3, 'dd'
UNION
SELECT 4, 'hh'
GO

CREATE FUNCTION MyDatePart(@IntervalType tinyint)
RETURNS varchar(255)
AS
BEGIN
IF NOT EXISTS (SELECT * FROM MyEnumTable WHERE DatePartID = @IntervalType)
   RETURN 'Invalid IntervalType'

--Do your stuff
DECLARE @DatePartvalue char(2)
SELECT  @DatePartValue = DatePartValue
FROM    MyEnumTable
WHERE   DatePartID = @IntervalType

RETURN @DatePartValue
END

GO

--Check it out
SELECT dbo.MyDatePart(3), dbo.MyDatePart(12)

Of course, my example is oversimplified, but you get the idea.

Also, consider making the function a table-valued function for performance reasons, if you're planning on using the udf in set statements. I blogged about the performance implications of various function types here:

http://thehobt.blogspot.com/2009/02/scalar-functions-vs-table-valued.html

撩心不撩汉 2024-07-31 22:38:30

我想创建自己的函数,它接受 dd 而不是像“dd”这样的 char

我认为你在这方面运气不好。 如果您不单引号这些字符,它们将被解释为名称 - 但如果您希望它们按照您建议的方式使用,则不能在任何地方将它们定义为名称。

i would like to create my own function that accepts dd not char like 'dd'

I think you're out of luck on this. If you don't single-quote the characters, they'll be interpreted as a name--but you can't have defined them as a name anywhere if you want them to be used in the manner you propose.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文