Нужна помощь / объяснение того, как правильно добавить параметр в динамический запрос SQL - PullRequest
0 голосов
/ 10 июня 2019

Я ищу в базах данных и обратился к 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'.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...