== Why is this an issue?

Functions or procedures with a long parameter list are difficult to use, as one must figure out the role of each parameter.

[source,sql]
----
CREATE PROCEDURE dbo.SetCoordinates
    @x1 INT,
    @y1 INT,
    @z1 INT,
    @x2 INT,
    @y2 INT,
    @z2 INT
AS
    -- ...
----


The solution can be to:

* Split the function or the procedure into smaller ones

[source,sql]
----
CREATE PROCEDURE dbo.SetOrigin
(
    @x INT,
    @y INT,
    @z INT
)
AS
    SELECT @x
GO

CREATE PROCEDURE dbo.SetSize
(
    @width  INT,
    @height INT,
    @depth  INT
)
AS
     SELECT @width
GO
----

* Find a better https://learn.microsoft.com/en-us/sql/t-sql/statements/create-type-transact-sql[data structure] for the parameters that group data in a way that makes sense for the specific application domain

[source,sql]
----
CREATE TYPE dbo.Point AS TABLE
(
    Id  INT IDENTITY,
    X   INT,
    Y   INT,
    Z   INT
);
GO

CREATE PROCEDURE dbo.SetCoordinates
    @Points dbo.Point READONLY
AS
BEGIN
    DECLARE @x1 AS INT, @y1 AS INT, @z1 AS INT
    DECLARE @x2 AS INT, @y2 AS INT, @z2 AS INT
    SELECT @x1 = X, @y1 = Y, @z1 = Z FROM @Points ORDER BY Id OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
    SELECT @x2 = X, @y2 = Y, @z2 = Z FROM @Points ORDER BY Id OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY
END
GO

DECLARE @Points AS Point;
INSERT INTO @Points (X, Y, Z) VALUES (0, 0, 0);
INSERT INTO @Points (X, Y, Z) VALUES (1, 1, 1);

EXEC dbo.SetCoordinates @Points;
----

The https://learn.microsoft.com/en-us/sql/t-sql/xml/xml-transact-sql[XML data type] is another alternative to pass all the required data at once.

This rule raises an issue when a function or a procedure has more parameters than the provided threshold.

== Resources

=== Documentation

* https://learn.microsoft.com/en-us/sql/t-sql/statements/create-type-transact-sql[CREATE TYPE (Transact-SQL)]
* https://learn.microsoft.com/en-us/sql/t-sql/xml/xml-transact-sql[xml (Transact-SQL)]

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::../message.adoc[]

=== Parameters

.max
****

----
10
----

Maximum authorized number of parameters
****


'''
== Comments And Links
(visible only on this page)

include::../comments-and-links.adoc[]

endif::env-github,rspecator-view[]
