#r #sql-server
#r #sql-сервер
Вопрос:
Я запрашиваю базу данных SQL Server, чтобы вернуть объединенное значение. Возможно ли это?
cnn <- odbcConnect("CN")
query = gsub("n", " ", " DECLARE @Price VARCHAR(50) = ''
SELECT @Price = @Price [Price] ' '
FROM [dbo].[wine]
SELECT @Price")
query
dataset1 <- sqlQuery(cnn, query)
dataset1
Когда я запускаю запрос в SSMS, он работает. Это ошибка при dataset1
запуске:
[1] «42S02 208 [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server] Недопустимое имя объекта ‘dbo.wine'».
[2] «[RODBC] ОШИБКА: не удалось SQLExecDirect ‘ ОБЪЯВИТЬ @Price VARCHAR(50) = » ВЫБЕРИТЕ @Price = @Price [Цена] ‘ ‘ ИЗ [dbo].[wine] ВЫБЕРИТЕ @Price'»
Код:
CREATE TABLE [dbo].[wine]
(
[Year] [varchar](50) NULL,
[Price] [varchar](50) NULL,
[WinterRain] [varchar](50) NULL,
[AGST] [varchar](50) NULL,
[HarvestRain] [varchar](50) NULL,
[Age] [varchar](50) NULL,
[FrancePop] [varchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1952', N'7.495', N'600', N'17.1167', N'160', N'31', N'43183.569')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1953', N'8.0393', N'690', N'16.7333', N'80', N'30', N'43495.03')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1955', N'7.6858', N'502', N'17.15', N'130', N'28', N'44217.857')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1957', N'6.9845', N'420', N'16.1333', N'110', N'26', N'45152.252')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1958', N'6.7772', N'582', N'16.4167', N'187', N'25', N'45653.805')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1959', N'8.0757', N'485', N'17.4833', N'187', N'24', N'46128.638')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1960', N'6.5188', N'763', N'16.4167', N'290', N'23', N'46583.995')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1961', N'8.4937', N'830', N'17.3333', N'38', N'22', N'47128.005')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1962', N'7.388', N'697', N'16.3', N'52', N'21', N'48088.673')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1963', N'6.7127', N'608', N'15.7167', N'155', N'20', N'48798.99')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1964', N'7.3094', N'402', N'17.2667', N'96', N'19', N'49356.943')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1965', N'6.2518', N'602', N'15.3667', N'267', N'18', N'49801.821')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1966', N'7.7443', N'819', N'16.5333', N'86', N'17', N'50254.966')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1967', N'6.8398', N'714', N'16.2333', N'118', N'16', N'50650.406')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1968', N'6.2435', N'610', N'16.2', N'292', N'15', N'51034.413')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1969', N'6.3459', N'575', N'16.55', N'244', N'14', N'51470.276')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1970', N'7.5883', N'622', N'16.6667', N'89', N'13', N'51918.389')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1971', N'7.1934', N'551', N'16.7667', N'112', N'12', N'52431.647')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1972', N'6.2049', N'536', N'14.9833', N'158', N'11', N'52894.183')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1973', N'6.6367', N'376', N'17.0667', N'123', N'10', N'53332.805')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1974', N'6.2941', N'574', N'16.3', N'184', N'9', N'53689.61')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1975', N'7.292', N'572', N'16.95', N'171', N'8', N'53955.042')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1976', N'7.1211', N'418', N'17.65', N'247', N'7', N'54159.049')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1977', N'6.2587', N'821', N'15.5833', N'87', N'6', N'54378.362')
INSERT [dbo].[wine] ([Year], [Price], [WinterRain], [AGST], [HarvestRain], [Age], [FrancePop]) VALUES (N'1978', N'7.186', N'763', N'15.8167', N'51', N'5', N'54602.193')
GO
Комментарии:
1. Я действительно рекомендую не использовать синтаксис, такой как
SELECT @Price = @Price...
в T-SQL, для агрегирования sting. Используйте более надежное решение, такое какSTRING_AGG
илиFOR XML PATH
.2. Что касается ошибки (
Invalid object name 'dbo.wine'
), она сообщает вам о проблеме. Я подозреваю, что вы не подключаетесь к правильной базе данных.3. Отдельно отметим, почему ваши
Year
Age
Price
столбцы и определены как annvarchar
? Они должны быть числовыми типами данных иAge
должны быть вычисляемым значением; в противном случае это будет неправильно, как только мы введем новый год после вставки значения.
Ответ №1:
Почему бы просто не использовать агрегацию строк, а не этот довольно небезопасный =
синтаксис?
declare @price nvarchar(max);
select @price = string_agg(price, ' ') from [dbo].[wine];
select @price;
Обратите внимание, что вам, вероятно, потребуется более 50 символов для хранения этих 25 цен; Я использовал nvarchar(max)
.