L oop через поле Query and Update - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь l oop через поля, определенные в запросе к оператору обновления.

У меня есть следующее SQL:

Declare @SQL varchar(max)

@SQL= 'Select [a],[b],[c],[d],[e]....[z]
       From Table1;' 

Я хочу быть в состоянии l oop через все поля [a] - [z] и обновлять с помощью следующего оператора:

Update Table 1 
Set [a] = Case when [a] = 'Not at all' Then 0
               when [a] = 'Very Much' Then 10 End 

Имена полей на самом деле не [a] .. [z]; Я не могу запустить оператор обновления для всей таблицы, только для указанного c набора имен полей.

Пытается записать его программно на SQL Сервер.

Ответы [ 2 ]

0 голосов
/ 24 января 2020

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

Для ясности, я заимствовал SQL, чтобы сделать актуальное ОБНОВЛЕНИЕ из @ Dale-K сообщения и просто сделал его красивым.

DECLARE @strSQL NVARCHAR(1000)
DECLARE @strTable NVARCHAR(100)
DECLARE @strColName VARCHAR(100)


SET @strTable = N'Table1'

CREATE TABLE #COLUMNS(ColName varchar(100))

SET @strSQL = ' select COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME = @TableName  and DATA_TYPE in (''nvarchar'', ''varchar'')'


INSERT INTO #COLUMNS
EXEC sp_executeSQL @strSQL, N'@TableName nvarchar(100)', @TableName = @strTable


DECLARE  csrColumns  CURSOR LOCAL FORWARD_ONLY FOR
SELECT ColName FROM #COLUMNS

OPEN csrColumns
FETCH csrColumns INTO @strColName


WHILE @@FETCH_STATUS = 0
BEGIN

   SET @strSQL = N'UPDATE ' + @strTable + '
        SET ' + @strColName + ' = CASE WHEN ' + @strColName +'= ''Very Much'' THEN ''10''
        WHEN ' +  @strColName + ' = ''Not at all'' THEN ''0''
        ELSE ' + @strColName + ' END'

    exec sp_ExecuteSQL @strSQL

    FETCH csrColumns INTO @strColName

END

CLOSE csrColumns
DEALLOCATE csrColumns
0 голосов
/ 24 января 2020
Declare @SQL varchar(max) 
Declare @name varchar(100)
DECLARE @getid CURSOR

Set @getid = cursor for 
SELECT name 
FROM 
sys.dm_exec_describe_first_result_set('Select [a],[b],[c],[d],[e]....[z]
   From Table1', NULL, 0)

Open @getid 
FETCH NEXT
FROM @getid INTO  @name
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = 'Update Table1
        Set ' + @name + ' = Case when ' + @name +'= ''Very Much'' Then ''10''
        when ' +  @name + ' = ''Not at all'' Then ''0''
        Else ' + @name + ' End'

    Exec(@SQL)          
    FETCH NEXT
    FROM @getid INTO @name
END

CLOSE @getid
DEALLOCATE @getid

В основном dm_exec_describe_first_result_set захватывает имена полей и выводит их как набор записей. Затем мы просто передаем каждую из записей в @name и используем ее из нашего оператора обновления, а затем выполняем ее для каждой переданной записи.

Надеюсь, это поможет кому-то еще! Любопытно посмотреть, есть ли лучший способ.

...