我正在搜索数据库,并与StackOverflow取得了联系,以获取有关如何学习如何运行动态SQL的帮助。
我得到的答案非常有用,但没有给出确切的原因或原因的解释。现在,我试图在代码中添加另一个参数,但在添加它时遇到了麻烦。
我希望有人帮助我更正参数,以便正确输入参数并解释动态SQL语句中发生的情况。
让我们解决查询问题。一切正常,因为另一个StackOverflow海报可以正确运行。但是现在我需要在“ ControlID”列必须以字母Q开头的地方添加。 用我现在放入的方式,我收到一个错误,指出“ ControlID”列不存在。但是当我检查ControlID是否是正确的列名
select * FROM [EDDS1111111].[EDDSDBO].[Document] where ControlID like 'Q%'
我确实得到了结果。因此,它不是无效的列名。 我设计的“ ControlID”输入类似于在代码中之前添加工件ID的方式,因此我对为什么收到此错误感到困惑。
-- 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等于当前控件ID(以Q开头)。 我试图复制正确完成的部分,所以有些困惑。感谢您对我的理解有所帮助。
谢谢您的时间
edds.eddsdbo。[case]中没有ControlID列。但是它确实存在于FROM [EDDS'+ CAST(ArtifactID as nvarchar(128))+']。[EDDSDBO]。[Document]中的所有数据库中。 CreatedDate在。[Case]表中也不存在,但在.Document数据库中确实存在。这就是为什么我将ControlID的搜索放在查询的.Document部分的where语句旁边的原因
这是我尝试运行代码时返回的内容。
Invalid column name 'Controlid'.