Определяемый пользователем тип таблицы - Dynami c SQL Вызов функции - Не переключение баз данных (ошибка thows) - PullRequest
1 голос
/ 05 февраля 2020

Мне нужен SQL гуру, это сводит меня с ума ... Я получаю ошибку при выполнении динамического c SQL с пользовательским типом таблицы:

Ошибка: Тип операнда cla sh: VariableTableType несовместим с VariableTableType

Проблема: Кажется, в действительности не объявляется VariableTableType в базе данных [Database1], даже если Use [Database1] находится прямо над ним. Функция XT должна работать в базе данных [Database1], чтобы она работала.

Если я запускаю exe c с именем dbname, она работает, например: exe c database1.dbo.sp_execute sql @cmdTest - но у меня есть много клиентских баз данных, которые имеют одинаковую структуру базы данных (разные данные), где мне приходится передавать имя клиентской базы данных, поэтому я не могу жестко закодировать его таким образом. Если я сделаю @ dbname = 'MainDatabase', он запустится - просто не будет работать с нужной базой данных.

[MainDatabase] Содержит основной хранимый pro c, который имеет динамику c SQL: @ dbname = 'Database1'

      DECLARE @cmdTEST NVARCHAR(MAX)=N'USE '+@dbname +'
      DECLARE @t as dbo.VariableTableType
      INSERT @t
      SELECT VariableName,[Value],InstanceID FROM #tVarTble
      SELECT dbo.XT(''Test string'',7153,45,@t)RtnValue
      '
      exec sp_executesql @cmdTEST

Также попытался передать VariableTableType и поместить объявление за пределы Dynami c sql. --exe c sp_execute sql @ cmdTEST, N '@ t VariableTableType READONLY' ,t=@t

[База данных1] (эта функция также существует в [MainDatabase]

      ALTER FUNCTION [dbo].[XT] 
      (
        @text nvarchar(max),
        @instanceID INT,
        @storeID INT,
        @vt dbo.VariableTableType READONLY
      )
      RETURNS nvarchar(max)
      AS BEGIN
      … code here
       RETURN @return
      END

VariableTableType существует в [MainDatabase] и [Database1]

      CREATE TYPE [dbo].[VariableTableType] AS TABLE(
        [VariableName] [NVARCHAR](50) NULL,
        [Value] [NVARCHAR](50) NULL,
        [InstanceID] [INT] NULL
      )
...