Функция SQL Server для передачи типа в качестве параметра - PullRequest
0 голосов
/ 25 июня 2009

Возможно ли передать тип как параметр в функцию SQL?

спасибо заранее.

Ответы [ 2 ]

1 голос
/ 25 июня 2009

тип параметра определен в заголовке функции, в результате он всегда одинаков в функции. Когда вы передаете параметр, тип которого отличается от типа параметра определенного типа, SQL Server делает все возможное для этого с параметром определенного типа функции.

У меня есть несколько функций, которые я хочу работать так же, как вы. Чтобы обойти эту проблему, я должен определить параметр функции как varchar (x), а затем выполнить любой необходимый CVONVERT () или форматировать входящий параметр в функции, вызывая параметр при его вызове.

CREATE FUNCTION dbo.QuoteValue
(
     @InputStr      varchar(8000)  --value to format
)
RETURNS
varchar(8000)
AS
BEGIN
    RETURN COALESCE(''''+@InputStr+'''','null')
END
GO

DECLARE @DateValue  datetime
SET @DateValue=GETDATE()
PRINT '@DateValue='+dbo.QuoteValue(@DateValue)
PRINT '@DateValue='+dbo.QuoteValue(CONVERT(varchar,@DateValue,121))

В зависимости от того, что вы хотите, если вы хотите работать с датами или числами, задайте параметр функции varchar (x) и в функции используйте:

  • ISDATE (выражение) - ISDATE возвращает 1, если входное выражение является допустимой датой; в противном случае возвращается 0. В следующей таблице показаны возвращаемые значения для выбора примеров.
  • ISNUMERIC (Transact-SQL) - ISNUMERIC возвращает 1, когда входное выражение оценивается как допустимое целое число, число с плавающей запятой, денежный или десятичный тип; в противном случае возвращается 0. Возвращаемое значение 1 указывает, что выражение может быть преобразовано хотя бы в один из числовых типов.

вот пример того, как обрабатывать даты ...

CREATE FUNCTION dbo.DateXYZ
(
     @InputStr      varchar(50)  --date value manipulate
)
RETURNS
datetime
AS
BEGIN
    DECLARE @DateValue  datetime

    IF ISDATE(@InputStr)=1
    BEGIN
        SET @DateValue=@InputStr
        --do some datetime manipulation here
    END  
    RETURN @DateValue --will return null if not given a valid date
END
GO

Вы можете использовать его следующим образом:

DECLARE @X varchar(50)
DECLARE @Y varchar(50)
DECLARE @BadDate datetime
DECLARE @GoodDate datetime
SET @X='bad date!!'
SET @Y='1/1/2009'
SET @BadDate=dbo.DateXYZ(@X)
SET @GoodDate=dbo.DateXYZ(@Y)
SELECT @BadDate,@GoodDate

вы также можете передать параметр, чтобы указать, что вы передаете:

CREATE FUNCTION dbo.AnyType
(
     @InputStr      varchar(8000)  --general purpose value
    ,@Type          char(1)         --"I"nt, "F"loat, "D"atetime, "S"tring, etc...
)
RETURNS
varchar(8000)
AS
BEGIN
    DECLARE @ReturnValue  varchar(8000)

    IF @Type='I' --int
    BEGIN
        DECLARE @IntValue int
        SET @IntValue=@InputStr
        --do some int manipulation here
        SET @ReturnValue=@IntValue
    END  
    ELSE IF @Type='F' --float
    BEGIN
        DECLARE @FloatValue float
        SET @FloatValue=@InputStr
        --do some float manipulation here
        SET @ReturnValue=@FloatValue
    END  
       ELSE IF @Type='D' --datetime
    BEGIN
        DECLARE @DatetimeValue  datetime
        SET @DatetimeValue=@InputStr
        --do some datetime manipulation here
        SET @ReturnValue=CONVERT(varchar(23),@DatetimeValue,121)
    END   
    --etc...
    --etc...

    RETURN @ReturnValue
END
GO

Функции могут возвращать только один фиксированный тип, сделать его varchar (x) и заставить вызывающего присваивать его переменной соответствующего типа данных или при необходимости CAST в результирующем наборе.

0 голосов
/ 25 июня 2009
CREATE FUNCTION 
  dbo.MyFunction(@Param1 VARCHAR(50), @Param2 INT, @Param3 UNIQUEIDENTIFIER)
RETURNS
  INT

Конечно, вы можете определить тип для параметров вашей функции - но я думаю, это не совсем то, что вы спрашиваете, верно? Пожалуйста, уточните!

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...