Я ищу в базах данных и обратился к StackOverflow за некоторой помощью, чтобы узнать, как пройти через динамический SQL.
Ответ, который я получил, был чрезвычайно полезен, но не объяснил, что именно происходит и почему. Сейчас я пытаюсь добавить еще один параметр в код, и у меня возникают проблемы при его добавлении.
Я бы хотел, чтобы кто-нибудь помог мне исправить параметр, чтобы он правильно вводил, и объяснить, что происходит в динамическом операторе SQL.
Давайте перейдем к проблеме с запросом. Все отлично работает, как это было правильно с другим постером StackOverflow. Но теперь мне нужно добавить, где столбец «ControlID» должен начинаться с буквы Q.
Теперь я получаю сообщение об ошибке, в котором говорится, что столбец ControlID не существует. Но когда я проверяю, является ли ControlID правильным именем столбца
select * FROM [EDDS1111111].[EDDSDBO].[Document] where ControlID like 'Q%'
Я получаю результаты. Так что это не недопустимое имя столбца.
Я разработал этот ввод ControlID, чтобы он был похож на способ, которым идентификатор артефакта был добавлен ранее в коде, поэтому я не понимаю, почему я получаю эту ошибку.
-- this is used to add line breaks to make code easier to read
DECLARE @NewLine AS NVARCHAR(MAX) = CHAR(10)
-- to hold your dynamic SQL for all rows/inserts at once
DECLARE @sql NVARCHAR(MAX) = N'';
-- create temp table to insert your dynamic SQL results into
IF OBJECT_ID('tempdb..#DatabaseSizes', 'U') IS NOT NULL
DROP TABLE #DatabaseSizes;
create table #DatabaseSizes(
controlid nvarchar(128),
fileSize DECIMAL (10,6),
extractedTextSize DECIMAL(10,6)
)
SELECT @sql = @sql + N'' +
'select SUM(fileSize)/1024/1024/1024 as fileSize,
SUM(extractedTextSize)/1024/1024 as extractedTextSize ' + @NewLine +
'FROM [EDDS' + CAST(ArtifactID as nvarchar(128)) + '].[EDDSDBO].
[Document] ed' + @NewLine +
'where ed.CreatedDate >= (select CONVERT(varchar,dateadd(d,-
(day(getdate())),getdate()),106)) and ed.controlid = '+Cast(Controlid as
nvarchar(128))+'%' + @NewLine + @NewLine
FROM edds.eddsdbo.[Case]
WHERE name like '%Review%' and (StatusCodeArtifactID = '1780779' or
StatusCodeArtifactID = '1034288')
--controlid always needs to begin with a Q
-- for testing/validating
PRINT @sql
INSERT INTO #DatabaseSizes (
controlid,
fileSize,
extractedTextSize
)
-- executes all the dynamic SQL we just generated
EXEC sys.sp_executesql @SQL;
Как я уже говорил, я ожидал, что controlID будет равен текущему идентификатору элемента управления, где он будет начинаться с Q.
Я попытался скопировать часть, где это было сделано правильно, поэтому я немного запутался. Любая помощь для улучшения моего понимания очень ценится.
Спасибо за ваше время
В edds.eddsdbo нет столбца для ControlID. [Case]. Но он существует во всех базах данных, расположенных в FROM [EDDS '+ CAST (ArtifactID as nvarchar (128)) +']. [EDDSDBO]. [Document]. CreatedDate также не существует в таблицах. [Case], но существует в базах данных .Document. Вот почему я поставил поиск ControlID рядом с оператором where для раздела .Document запроса
Это то, что было возвращено при попытке запустить код.
Invalid column name 'Controlid'.