В таблицу sql вставляется только первый символ случайного идентификатора.

Я делаю массовую вставку в таблицу. у меня есть несколько триггеров для вставки нескольких столбцов из массовой вставки в разные таблицы. я генерирую буквенно-цифровые символы длиной 25 в качестве идентификатора. Для этого я создал функцию, вызвав эту функцию там, где мне нужны значения для столбцов @ID. но я получаю только первую цифру вставленных символов случайной строки.

Триггер, где я вызываю свою функцию

 IF NOT EXISTS(SELECT * FROM CHEMICAL WHERE Chemical_Name = @Chemical_Name)
    BEGIN
        INSERT INTO CHEMICAL(Chemical_ID, Chemical_Name, CAS_Number,EHS,TPQ_Pounds,RQ_Pounds,last_updated)
        VALUES(dbo.SDS_GENERATE_ID(), @Chemical_Name,@CAS_Number, @EHS,@TPQ_Pounds,@RQ_Pounds,getdate())
    END 

Функция SDS_GENERATE_ID

CREATE FUNCTION SDS_GENERATE_ID()
RETURNS VARCHAR
AS
BEGIN

DECLARE @r varchar(25)
SELECT @r = coalesce(@r, '') + n
FROM (SELECT top 25 
CHAR(number) n FROM
master..spt_values
WHERE type = 'P' AND 
(number between ascii(0) and ascii(9)
or number between ascii('A') and ascii('Z')
or number between ascii('a') and ascii('z'))
ORDER BY (select * from MyRAND)) a
return @r
   END;
   GO

ПРОСМОТР MyRand, ПОСКОЛЬКУ Я НЕ МОГУ ИСПОЛЬЗОВАТЬ NEWID() в udfs

CREATE VIEW [dbo].[MyRAND]
AS
select newid() as randID
GO

Идентификатор столбца Chemical_ID должен состоять из 25 символов

Любая помощь приветствуется и заранее благодарна.


person Sakthivel    schedule 19.09.2016    source источник
comment
Только один символ... почти всегда означает, что вы объявили varchar без указания длины.   -  person Tab Alleman    schedule 19.09.2016


Ответы (2)


CREATE FUNCTION SDS_GENERATE_ID()
RETURNS VARCHAR

Вам нужно будет указать длину, иначе вы получите одиночный Char

ваша функция в ее текущей форме возвращает только значение ниже.

0

при изменении путем указания длины, как показано ниже, возвращается

CREATE FUNCTION SDS_GENERATE_ID()
RETURNS VARCHAR(25)

дает

01234656789..
person TheGameiswar    schedule 19.09.2016

Вы не указали длину символов в возвращаемом типе функции:

alter FUNCTION SDS_GENERATE_ID()
RETURNS VARCHAR(20)
AS
BEGIN

DECLARE @r varchar(25)
SELECT @r = coalesce(@r, '') + n
FROM (SELECT top 25 
CHAR(number) n FROM
master..spt_values
WHERE type = 'P' AND 
(number between ascii(0) and ascii(9)
or number between ascii('A') and ascii('Z')
or number between ascii('a') and ascii('z'))
ORDER BY (select id from employee)) a
return @r
   END;
   GO

Примечание. замените требуемую длину в приведенном выше типе возвращаемого значения.

person Sandip - Frontend Developer    schedule 19.09.2016