T SQL Таблица возврата UDF с различным количеством столбцов в зависимости от значения первого параметра функции - PullRequest
0 голосов
/ 21 марта 2020

Возможно ли это? Если нет, каковы другие варианты?

Одна из вещей, которые я пытался сделать до сих пор, - это (не работает; я также знаю, что в случае, если значение первого аргумента равно <0 или> 4 Я пытаюсь вернуть неинициализированную переменную, но это примерно то, что я хотел бы получить: Я бы предпочел гораздо больше, чтобы получить столик):

SET NOCOUNT ON;
USE AdventureWorks2008;
GO

IF OBJECT_ID('dbo.fn_ConcatPeopleData') IS NOT NULL
 DROP FUNCTION dbo.fn_ConcatPeopleData;
GO


CREATE FUNCTION dbo.fn_ConcatPeopleData
 (@bid AS NCHAR(5), @columns AS INT ) RETURNS NCHAR(1000)
AS
BEGIN
DECLARE @data AS VARCHAR(8000);
SET @data = '';
    IF (@columns = 1)
        SELECT @data = @data + CAST(LastName AS VARCHAR(100))
        FROM Person.Person AS P
        WHERE P.BusinessEntityID = @bid;

    ELSE IF (@columns = 2)
        SELECT @data = @data + CAST(LastName AS VARCHAR(100))+' ' + CAST(FirstName AS VARCHAR(100))
        FROM Person.Person AS P
        WHERE P.BusinessEntityID = @bid;

    ELSE IF (@columns = 3)
         SELECT @data = @data + CAST(LastName AS VARCHAR(100))+' ' + CAST(FirstName AS VARCHAR(100))+', ' +
                               CAST(E.EmailAddress AS VARCHAR(100))
         FROM Person.Person AS P 
         INNER JOIN Person. EmailAddress AS E ON P.BusinessEntityID = E.BusinessEntityID
         WHERE P.BusinessEntityID = @bid;

    ELSE IF (@columns = 4)
        SELECT @data = @data + CAST(LastName AS VARCHAR(100))+' ' + CAST(FirstName AS VARCHAR(100))+', ' + 
                               CAST(E.EmailAddress AS VARCHAR(100))+', ' + CAST(A.AddressLine1 AS VARCHAR(100))+' ' +
                               CAST(A.City AS VARCHAR(100))+' ' + CAST(A.PostalCode AS VARCHAR(100))
               FROM Person.Person AS P
               INNER JOIN Person.EmailAddress AS E ON P.BusinessEntityID = E.BusinessEntityID
               INNER JOIN Person.BusinessEntityAddress AS BA ON P.BusinessEntityID = BA.BusinessEntityID
               INNER JOIN Person.Address AS A ON BA.AddressID = A.AddressID
               WHERE P.BusinessEntityID = @bid;
RETURN @data;
END


SELECT BusinessEntityID, dbo.fn_ConcatPeopleData(BusinessEntityID, 3) AS [Person Info]
FROM Person.Person;

1 Ответ

0 голосов
/ 21 марта 2020

На самом деле, если вы определите возвращаемое значение, ваш код будет работать:

DECLARE @People TABLE (
    Lastname VARCHAR(50),
    FirstName VARCHAR(50),
    Email VARCHAR(50),
    Address VARCHAR(50)
) ;

IF @columns = 1 BEGIN
    INSERT INTO @People (LastName)
        SELECT P.LastName
        FROM Person.Person AS P;
END;
ELSE IF @columns = 2 BEGIN
    INSERT INTO @People (LastName, FirstName)
        SELECT P.LastName, P.FirstName
        FROM Person.Person P;
END;
. . . 
RETURN @People

Неиспользуемые столбцы будут NULL, что является вполне приемлемым значением для столбцов, которые не имеют назначенного значение.

Примечания:

  • Временные таблицы не имеют @. Они начинаются с #. В этом случае с табличной переменной все в порядке.
  • Я не знаю, что as можно использовать при объявлении типа столбца в таблице. Он используется для сгенерированных столбцов.
  • Будьте осторожны с псевдонимами таблиц.
...