Обновление таблицы из хранимой процедуры с помощью openrowset

Я пытаюсь обновить столбец [IsUnique-check] в таблице из хранимой процедуры. Я пробую следующий код.

ALTER PROCEDURE spIsUnique
    @columnname NVARCHAR(MAX),
    @tablename NVARCHAR(MAX)
AS
BEGIN
    EXEC ('select IIf (count(*)>1,''False'',''True'') as [IsUnique-check] 
           from '+@tablename+' 
           group by '+@columnname)
END

DECLARE @start INT, @count INT,
        @applicableforcolumn VARCHAR(MAX),
        @name VARCHAR(MAX)

SET @start = 1

SELECT @count = COUNT(*) 
FROM dbo.fnplatformnumber23()

WHILE @start <= @count
BEGIN
    SELECT @name = name 
    FROM sys.columns 
    WHERE object_id = OBJECT_ID('fnplatformnumber23') 
      AND column_id = @start

    IF @name = 'IsUnique'
    BEGIN
        SELECT @applicableforcolumn = ApplicableForColumn
        FROM dbo.fnplatformnumber23()
        WHERE IsUnique IS NOT NULL;

        EXEC spIsUnique @applicableforcolumn,'fnproduct()'
        --declare @alter nvarchar(max)= 'alter table ##producttable add [IsUnique-check] nvarchar(max);'
        --exec sp_executesql @alter

        UPDATE ##producttable 
        SET [IsUnique-check] = EXEC spIsUnique @applicableforcolumn 'fnproduct()' from OPENROWSET('SQL Server',
    'Server=DESKTOP-JEQ4NUR\SQLEXPRESS;Trusted_Connection=yes;',

    'exec spIsUnique '+@applicableforcolumn+' ''fnproduct()'';'
)
    END

    SET @start = @start + 1
END

Но он говорит неправильный синтаксис рядом с exec.

Помогите мне решить это


person Awesome    schedule 19.01.2018    source источник
comment
Покажите код процедуры spIsUnique, чтобы понять, как он возвращает значение   -  person Pரதீப்    schedule 19.01.2018
comment
Я отредактировал его. Пожалуйста, посмотрите его   -  person Awesome    schedule 19.01.2018
comment
openrowset() не принимает выражение. Не думайте, что он также принимает переменную. Возможно, вам придется использовать Dynamic SQL для формирования запроса и использовать sp_executesql для его выполнения.   -  person Squirrel    schedule 19.01.2018
comment
Update table set column = exec astoredproc определенно неверно. Сначала вам нужно вернуть значение из процедуры в скалярное значение.   -  person Nick.McDermaid    schedule 19.01.2018


Ответы (1)


OPENROWSET не поддерживает параметр. Поэтому вместо этого сделайте свой запрос как строку запроса и выполните ее с помощью sp_executesql или EXEC. Может быть вот так

DECLARE @SQL VARCHAR(MAX) = '
SELECT 
    * 
    FROM OPENROWSET(''SQL Server'',
    ''Server=DESKTOP-JEQ4NUR\SQLEXPRESS;Trusted_Connection=yes;'',

    ''exec spIsUnique '''+@applicableforcolumn+''',fnproduct());'


exec(@SQL)

Вставьте результат выше во временную таблицу, а затем обновите свою окончательную таблицу, присоединившись к этой временной таблице.

person Jayasurya Satheesh    schedule 19.01.2018