2016-03-28 2 views
0

У меня есть переменные таблицы @searchResult:Обновления переменной

DECLARE @searchResult TABLE (
    [name_template] NVARCHAR(50), 
    [record_id] INT, 
    [record_name] NVARCHAR(50) 
); 

И стол [records]:

CREATE TABLE [records] (
    [record_id] INT IDENTITY(1, 1) PRIMARY KEY, 
    [record_name] NVARCHAR(50) 
) 

@searchResult содержит записи с [name_template] заполнена только. Я хочу обновить его последними [record_id] и [record_name] от [records] стол, который соответствует [name_template].

Я попытался folowing SQL запрос без успеха:

UPDATE @searchResult 
SET [record_id] = r.[record_id], [record_name] = r.[record_name] 
FROM (
    SELECT TOP 1 
      r.[record_id] 
     , r.[record_name] 
    FROM [records] AS r 
    WHERE r.[record_name] LIKE [name_template] 
    ORDER BY r.[record_id] DESC 
) AS r; 

Сообщение об ошибке:

Invalid имя столбца 'name_template'.

Что такое правильный синтаксис для обновления @searchResult с требуемыми значениями?

+1

Посмотрите, что ваш запрос используется для обновления. Я полагаю, что в записях таблицы нет столбца с именем name_template? Это переменная таблицы. Помните, что ваш запрос должен выполняться сам по себе. Это означает, что в этом случае вам нужно присоединиться к вашей переменной таблицы в запросе. –

+0

цитаты отсутствуют ..like 'name_template' или like '% name_template%' – TheGameiswar

+0

Возможный дубликат [обновление одной таблицы с данными от другого] (http://stackoverflow.com/questions/5036918/update-one-table-with- data-from-another) –

ответ

3

Вы должны сделать CROSS APPLY на столах.

UPDATE @searchResult 
SET [record_id] = r.[record_id], 
    [record_name] = r.[record_name] 
FROM @searchResult SR 
CROSS APPLY (
    SELECT TOP 1 * 
    FROM [records] 
    WHERE [record_name] LIKE [name_template] -- Your wish, but do you really need LIKE matching?? 
    ORDER BY [record_id] DESC 
) AS r; 
+0

Этот запрос сделал серию! PS Я действительно хочу использовать LIKE, потому что [name_template] содержит специальные символы '%' и '_' для поиска по шаблону – Egor

+0

лучше, чем мой ответ. +1. –

1

Попробуйте это:

UPDATE t 
SET [record_id] = r.[record_id], 
    [record_name] = r.[record_name] 
FROM @searchResult t 
INNER JOIN 
(
    SELECT MAX([record_id]) As [record_id] 
      ,[record_name] 
    FROM [records] 
    GROUP BY [record_name] 
) r 
ON r.[record_name] LIKE t.[name_template]; 

Update:
Кажется, что работает отлично от того, что я проверил:

Создание таблицы и таблицы переменных:

CREATE TABLE [records] (
    [record_id] INT IDENTITY(1, 1) PRIMARY KEY, 
    [record_name] NVARCHAR(50) 
) 

DECLARE @searchResult TABLE (
    [name_template] NVARCHAR(50), 
    [record_id] INT, 
    [record_name] NVARCHAR(50) 
); 

Populate с данными выборки:

INSERT INTO [records] ([record_name]) VALUES('a'), ('a'), ('a'), ('b'), ('b') 

INSERT INTO @searchResult ([name_template]) VALUES ('a'), ('b') 

Обновление таблицы переменных:

UPDATE t 
SET [record_id] = r.[record_id], 
    [record_name] = r.[record_name] 
FROM @searchResult t 
INNER JOIN 
(
    SELECT MAX([record_id]) As [record_id] 
      ,[record_name] 
    FROM [records] 
    GROUP BY [record_name] 
) r 
ON r.[record_name] LIKE t.[name_template]; 

результаты проверки:

SELECT * 
FROM records 

SELECT * 
FROM @searchResult 

DROP TABLE records 

Результаты:

records 
record_id record_name 
----------- ----------- 
1   a 
2   a 
3   a 
4   b 
5   b 

@searchResult 
name_template record_id record_name 
------------- --------- ----------- 
a    3   a 
b    5   b 
+0

Этот запрос работает, но он обновляет [record_id] и [record_name] не последние данные. – Egor

+0

см. Мой отредактированный ответ. –

+0

Спасибо за ваши усилия.Вот пример, когда он не обновляется последними данными (сохраняйте свои тестовые данные и добавляйте их): 'INSERT INTO [records] ([record_name]) VALUES ('ab'); INSERT INTO @searchResult ([name_template]) VALUES ('a%') ' Я ожидаю @searchResult для [name_template] 'a%' после инструкции обновления, чтобы содержать [record_id] of 'ab' – Egor

Смежные вопросы