I was wondering what is the better practice to return a table from a function?
Should I define the table structure or use RETURNS TABLE? What are the scenarios of using both flavors?
For example:
ALTER FUNCTION [dbo].[fnSplitIDs]
(
   @List VARCHAR(MAX)
)
RETURNS TABLE
AS
  RETURN ( 
    SELECT Item AS ID FROM
      ( SELECT Item = x.i.value('(./text())[1]', 'uniqueidentifier')
        FROM ( SELECT [XML] = CONVERT(XML, '<i>'
        + REPLACE(REPLACE(@List, ',', '</i><i>') , '''', '') + '</i>').query('.')
          ) AS a CROSS APPLY [XML].nodes('i') AS x(i) ) AS y
      WHERE Item IS NOT NULL
  );
Versus:
ALTER FUNCTION [dbo].[fnSplitIDs]
(
   @List VARCHAR(MAX)
)
RETURNS @t TABLE([ID] uniqueidentifier)
AS
BEGIN
  INSERT INTO @t([ID])
  SELECT Item AS ID FROM
      ( SELECT Item = x.i.value('(./text())[1]', 'uniqueidentifier')
        FROM ( SELECT [XML] = CONVERT(XML, '<i>'
        + REPLACE(@List, ',', '</i><i>') + '</i>').query('.')
          ) AS a CROSS APPLY [XML].nodes('i') AS x(i) ) AS y
      WHERE Item IS NOT NULL
  RETURN
END
Usage:
SELECT * FROM [dbo].[fnSplitIDs]('{ADD26A9A-ABDD-4755-9B3C-C4F12C46988F},{C9F92768-77F6-468B-A85C-4F42C2FDD6F6}')
 
    