MS sql inserta un número aleatorio establecido en el parámetro usando

MS sql inserta un número aleatorio establecido en el parámetro usando el procedimiento almacenado

¿Cómo hago el parámetro code_gen, doy e inserto un valor aleatorio?

 @DATE_CREATED datetime = null,
 @STATUS varchar(10) = 'Open',
 @CODE_GEN as ('TN'+ SELECT LEFT(CONVERT(varchar(100), NEWID()),3))+'-'+RIGHT(CONVERT(varchar(100), NEWID()),5)

as
set nocount on
INSERT INTO MEDREC_CODEGEN (Status,DATE_CREATED,CODE_GEN)
values (@STATUS, COALESCE(@DATE_CREATED,GETDATE()), @CODE_GEN)
Mostrar la mejor respuesta
Avatar gbn

SQL Server solo acepta literales como parámetro por defecto.

predeterminado

Un valor predeterminado para un parámetro. Si se define un valor predeterminado para un parámetro, el procedimiento se puede ejecutar sin especificar un valor de ese parámetro. El valor predeterminado debe ser una constante o puede ser NULO..

Cámbielo a una declaración SET en línea, tal vez con un ISNULL si establece el valor predeterminado en NULL.

Usar esto puede ser de ayuda

DECLARE @DATE_CREATED AS DATETIME = NULL

 DECLARE @STATUS AS  varchar(10) = 'Open'

 DECLARE  @CODE_GEN as varchar(10) = NULL
 SET @CODE_GEN = ('TN'+ (SELECT LEFT(CONVERT(varchar(100), NEWID()),3))+'-
                 '+RIGHT(CONVERT(varchar(100), NEWID()),5))

set nocount on
        INSERT INTO MEDREC_CODEGEN (Status,DATE_CREATED,CODE_GEN)
        values (@STATUS, COALESCE(@DATE_CREATED,GETDATE()), @CODE_GEN)

Aquí lo que hice

create table #Temp
(
    Status Varchar(50), 
    DATE_CREATED Varchar(50), 
    CODE_GEN Varchar(50)
)
DECLARE @DATE_CREATED AS DATETIME = NULL

 DECLARE @STATUS AS  varchar(10) = 'Open'

 DECLARE  @CODE_GEN as varchar(10) = NULL
 SET @CODE_GEN = ('TN'+ (SELECT LEFT(CONVERT(varchar(100), NEWID()),3))+'-
                 '+RIGHT(CONVERT(varchar(100), NEWID()),5))

set nocount on
        INSERT INTO #Temp (Status,DATE_CREATED,CODE_GEN)
        values (@STATUS, COALESCE(@DATE_CREATED,GETDATE()), @CODE_GEN)


Select * FROM #Temp         

Resultado:

Status  DATE_CREATED         CODE_GEN
Open    Apr  4 2018 12:23PM  TN437-    

dice "Debe declarar la variable escalar "@CODE_GEN""

Gracias por tu ayuda y esfuerzo

No puede usar expresiones como valores predeterminados en una declaración de procedimiento almacenado. Sin embargo, puede usarlos con la instrucción SET una vez dentro de su código.

Esto falla:

CREATE PROCEDURE MyProcedure
    @Parameter INT = (100 + 50) -- Incorrect syntax near '('.
AS
BEGIN

    RETURN @Parameter

END

Esto funciona:

CREATE PROCEDURE MyProcedure
    @Parameter INT = NULL
AS
BEGIN

    SET @Parameter = 100 + 50

    RETURN @Parameter

END

Para su caso:

CREATE PROCEDURE YourProcedure
    @DATE_CREATED datetime = null,
    @STATUS varchar(10) = 'Open',
    @CODE_GEN VARCHAR(200) = NULL
as
BEGIN

    set nocount on

    IF @CODE_GEN IS NULL
        SET @CODE_GEN = ('TN'+ SELECT LEFT(CONVERT(varchar(100), NEWID()),3))+'-'+RIGHT(CONVERT(varchar(100), NEWID()),5)

    INSERT INTO MEDREC_CODEGEN (Status,DATE_CREATED,CODE_GEN)
    values (@STATUS, COALESCE(@DATE_CREATED,GETDATE()), @CODE_GEN)

END