Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

máy chủ sql - chuyển các hằng số chưa được trích dẫn cho các chức năng như DATEPART

Bạn thực sự không thể giới hạn đầu vào của UDF vào một tập hợp giá trị nhỏ (theo hiểu biết tốt nhất của tôi).

Tôi khuyên bạn nên tạo một tabe cho các giá trị được liệt kê của bạn - một cái gì đó như thế này:

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)

Tất nhiên, ví dụ của tôi là đơn giản hóa quá mức, nhưng bạn có thể hiểu được.

Ngoài ra, hãy xem xét việc đặt hàm này thành một hàm có giá trị bảng vì lý do hiệu suất, nếu bạn định sử dụng udf trong các câu lệnh đã đặt. Tôi đã viết blog về tác động của hiệu suất của các loại chức năng khác nhau tại đây:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể sử dụng tổng hợp hoặc truy vấn con trong một biểu thức được sử dụng cho nhóm theo danh sách của mệnh đề GROUP BY

  2. Ví dụ về Chèn máy chủ SQL

  3. Kích thước được sử dụng với NVARCHAR có quan trọng không?

  4. Thay đổi cột dữ liệu từ varchar (max) thành nvarchar (max) trong SQL Server 2008

  5. Linq lựa chọn phạm vi hồ sơ