souvikcode Ответов: 1

Как вернуть выходные мультиданные в выводе в SQL запрос


insert into build_master(lastUpdatedOn) output inserted.buildId,@versionName,@devrecordId,@developedBy,@reportDate,@scheduledDate,
@implementationdate,@closeDate,@environment,@status,@knownIssue,@comments,
@functionAdded,@functionUpdated,@defectsFixed into  build_versions(buildId,versionName,devrecordId,developedBy,reportDate,scheduledDate,
implementationdate,closeDate,environment,status,knownIssue,comments,functionAdded,
functionUpdated,defectsFixed) output inserted.buildId,inserted.buildVersionId
               values(@lastupdatedon);

Подчеркнутая часть будет возвращена из второй таблицы. Во второй таблице есть столбец auto generate id с именем "
buildVersionId
. Но я получаю ошибку недопустимого столбца.
Это означает, что предложение output не возвращает данные из второй таблицы.

USE [abc]
GO
/****** Object:  Table [dbo].[build_master]    Script Date: 05-Jan-17 10:26:08 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[build_master](
	[buildId] [bigint] IDENTITY(1,1) NOT NULL,
	[lastUpdatedOn] [datetime] NOT NULL,
 CONSTRAINT [PK_build_master] PRIMARY KEY CLUSTERED 
(
	[buildId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[build_versions]    Script Date: 05-Jan-17 10:26:09 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[build_versions](
	[buildVersionId] [bigint] IDENTITY(1,1) NOT NULL,
	[buildId] [bigint] NOT NULL,
	[versionName] [nvarchar](50) NOT NULL,
	[devrecordId] [int] NOT NULL,
	[developedBy] [nvarchar](max) NOT NULL,
	[reportDate] [datetime] NOT NULL,
	[scheduledDate] [datetime] NULL,
	[implementationdate] [datetime] NULL,
	[closeDate] [datetime] NULL,
	[environment] [nvarchar](50) NOT NULL,
	[status] [nvarchar](50) NOT NULL,
	[knownIssue] [nvarchar](max) NULL,
	[comments] [nvarchar](max) NULL,
	[functionAdded] [nvarchar](max) NOT NULL,
	[functionUpdated] [nvarchar](max) NULL,
	[defectsFixed] [nvarchar](max) NULL,
 CONSTRAINT [PK_build_versions] PRIMARY KEY CLUSTERED 
(
	[buildVersionId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_build_versions] UNIQUE NONCLUSTERED 
(
	[buildId] ASC,
	[versionName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO
ALTER TABLE [dbo].[build_versions] ADD  CONSTRAINT [DF_build_versions_environment]  DEFAULT ('Select One') FOR [environment]
GO
ALTER TABLE [dbo].[build_versions] ADD  CONSTRAINT [DF_build_versions_status]  DEFAULT ('Open') FOR [status]
GO


Что я уже пробовал:

Я попробовал вышеописанный sql-запрос,но бот работает.

David_Wimbley

Вы должны опубликовать свою схему таблицы для build_master и build_versions, чтобы люди могли попытаться воспроизвести вашу проблему.

1 Ответов

Рейтинг:
1

Wendelius

Я не уверен, правильно ли я понимаю ситуацию, но почему у вас есть два выходных предложения? Например, отлично работает следующее

insert into build_master(lastUpdatedOn) 
output inserted.buildId,
		'a',
		1,
		'a',
		getdate(),
		getdate(), 
		getdate(),
		getdate(),
		'a',
		'a',
		'a',
		'a',
		'a',
		'a',
		'a' 
into  build_versions(
		buildId,
		versionName,
		devrecordId,
		developedBy,
		reportDate,
		scheduledDate,
		implementationdate,
		closeDate,
		environment,
		status,
		knownIssue,
		comments,
		functionAdded,
		functionUpdated,
		defectsFixed) 
--output inserted.buildId,inserted.buildVersionId
values(getdate());

[ДОБАВЛЕН]
Может быть трудно получить значения из обеих таблиц за один прогон. Не могли бы вы использовать два запуска в одной партии? Рассмотреть следующее
declare @MasterOutput TABLE  (  
    buildId bigint
);  

declare @VersionsOutput TABLE  (  
    buildId bigint,
    buildversionid bigint
);  

insert into build_master(lastUpdatedOn) 
output inserted.buildId
into @MasterOutput
values (getdate());

insert into build_versions (
		buildId,
		versionName,
		devrecordId,
		developedBy,
		reportDate,
		scheduledDate,
		implementationdate,
		closeDate,
		environment,
		status,
		knownIssue,
		comments,
		functionAdded,
		functionUpdated,
		defectsFixed) 

output inserted.buildId,inserted.buildVersionId
into @VersionsOutput
select a.buildId,
		'a',
		1,
		'a',
		getdate(),
		getdate(), 
		getdate(),
		getdate(),
		'a',
		'a',
		'a',
		'a',
		'a',
		'a',
		'a' 
from @MasterOutput a;

select * from @MasterOutput;

select * from @VersionsOutput;
Выход таков
buildId
-------
7

buildId   buildversionid
-------   --------------
7         4
Конечно, вам не понадобятся последние два оператора select, так как они предназначены только для проверки результата из пакета.


souvikcode

смотрите, buildVersionId находится во второй таблице. Итак, из вашего запроса, как я могу это получить?

souvikcode

смотрите здесь, мне нужен buildVersionId, и это во второй таблице. Так как же мне его вернуть?

souvikcode

Значит, никакого решения для этого нет?

Wendelius

Взгляните на измененный ответ.

souvikcode

здесь два вопроса.
1. вы вставляете сначала временную таблицу, а затем извлекаете ее, скажем, для основной записи. Я надеюсь,что не будет никаких проблем, если несколько пользователей одновременно вставят данные, не так ли?
2.выберите.buildId,
"а",
1,
"а",
функция GETDATE(),
функция GETDATE(),
функция GETDATE(),
функция GETDATE(),
"а",
"а",
"а",
"а",
"а",
"а",
"а"
из @MasterOutput a;

вместо "а" будут вставлены данные главной таблицы. таким образом,временная таблица @MasterOutput должна иметь все столбцы, такие же, как и основная таблица базы данных, верно?

Wendelius

Таблица не является временной таблицей, это переменная таблицы, поэтому область действия-это пакет, в котором она объявлена. Никто другой этого не увидит.

Что касается значений 'a' в операторе insert, то вы использовали такие переменные, как @environment или @status. Чтобы проверить ситуацию, я просто заменил их константами, но вы бы использовали фактические переменные.

Я считаю, что @mastertable нужны только те столбцы, которые возвращаются из первой вставки. По крайней мере, похоже, что переменные, которые вы используете, исходят не из таблицы build_master, а из вашей программы.

souvikcode

Хорошо, сэр, спасибо. Я попробую ответить на этот вопрос.

Wendelius

Надеюсь, это сработает :)