Как сгенерировать различные ФИО в SQL Server

Задача - получить множество случайных имен в SQL в виде Иван Иванович Иванов. 

Используем следующую процедуру, где вы можете добавить свой список имен, фамилий и отчеств: 

create or alter PROCEDURE [dbo].as_fioGenerator
	 @isWoman bit = 0,
	 @withF bit = 1,
	 @withI bit = 1,
	 @withO bit = 1
AS
BEGIN
	declare @res nvarchar(max) = ''

	declare @fm nvarchar(max) = 'Иванов,Петров,Сидоров,Комаров,Смирнов,Сергеев,Никитин,Абрамов,Ильин,Лавров,Зеленин'
	declare @im nvarchar(256) = 'Кирилл,Евгений,Семен'
	declare @om nvarchar(256) = 'Петрович,Анатольевич,Дмитриевич,Иванович,Сергеевич,Павлович,Ильич,Михайлович'

	declare @fw nvarchar(max) = 'Иванова,Петрова,Сидорова,Комарова,Смирнова,Сергеева,Никитина,Абрамова,Ильина,Лаврова,Зеленина'
	declare @iw nvarchar(256) = 'Ольга,Ирина,Яна,Жанна,Наталья,Марина,Мария,Елизавета,Евгения,Ксения,Оксана'
	declare @ow nvarchar(256) = 'Петровна,Анатольевна,Дмитриевна,Ивановна,Сергеевна,Павловна,Михайловна'


	declare @f nvarchar(max) = iif(@isWoman=1,  @fw,  @fm)
	declare @i nvarchar(max) = iif(@isWoman=1,  @iw,  @im)
	declare @o nvarchar(max) = iif(@isWoman=1,  @ow,  @om)

	if(@withF=1) begin
		set @res = @res + iif(@res='', '', ' ') + (select top 1 Value from dbo.split(@f,',') order by newid())
	end
	if(@withI=1) begin
		set @res = @res + iif(@res='', '', ' ') + (select top 1 Value from dbo.split(@i,',') order by newid())
	end
	if(@withO=1) begin
		set @res = @res + iif(@res='', '', ' ') + (select top 1 Value from dbo.split(@o,',') order by newid())
	end

	select @res
END

Функция SPLIT (разбивает строку с разделителями на таблицу): 

CREATE OR ALTER FUNCTION [dbo].[split] ( @stringToSplit NVARCHAR(MAX), @char NVarCHAR)

RETURNS
 @returnList TABLE ([value] [nvarchar] (max), num int)
AS
BEGIN

Declare  @r1 TABLE ([value] [nvarchar] (max), num int)

 DECLARE @name NVARCHAR(max)
 DECLARE @pos INT
 declare  @index int = 1

 WHILE CHARINDEX(@char, @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(@char, @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @r1 
  SELECT @name, @index

  set @index = @index  + 1

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 INSERT INTO @r1
 SELECT @stringToSplit, @index


 insert into @returnList 
 select [Value], num from  @r1 order by num

 RETURN
END

Использование: 

exec [dbo].as_fioGenerator - мужские ФИО

exec [dbo].as_fioGenerator @isWoman = 1 - женские ФИО

exec [dbo].as_fioGenerator @isWoman = 1, @withF = 1, @withI = 1, @withO = 0 - женские Фамилия и Имя

exec [dbo].as_fioGenerator @isWoman = 0, @withF = 0, @withI = 1, @withO = 0 - мужские Имена

Насколько полезной была статья?

Что еще посмотреть по SQL Server

Выгода от использования Falcon Space

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Планируете делать веб-проект?
Сайт использует Cookie. Правила конфиденциальности OK