Sql server 为员工获取不同的范围
我使用如下动态查询检索员工的不同角色/范围:Sql server 为员工获取不同的范围,sql-server,tsql,Sql Server,Tsql,我使用如下动态查询检索员工的不同角色/范围: DECLARE @roles NVARCHAR(MAX)='' DECLARE @table TABLE ( Scope NVARCHAR(MAX) ) SELECT @roles=@roles+ 'Select '+isnull(er.ColumnName,'*')+' from '+er.SchemaName+'.'+er.TableName+' where '+kcu.COLUMN_
DECLARE @roles NVARCHAR(MAX)=''
DECLARE @table TABLE
(
Scope NVARCHAR(MAX)
)
SELECT @roles=@roles+ 'Select '+isnull(er.ColumnName,'*')+' from '+er.SchemaName+'.'+er.TableName+' where '+kcu.COLUMN_NAME +'='+er1.ValueId
from [Function].[Role] er
left join INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc on
tc.TABLE_NAME=er.TableName and tc.TABLE_SCHEMA=er.SchemaName
left join INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu on kcu.CONSTRAINT_NAME=tc.CONSTRAINT_NAME
left JOIN Employee_Role er1 ON er.EntityRoleId = er1.RoleId
left JOIN Employee e ON er1.EmployeeId = e.EmployeeId
where e.EmployeeId=54 AND tc.CONSTRAINT_TYPE='PRIMARY KEY' AND er1.ValueId !=0 AND er1.ValueId IS NOT NULL
INSERT INTO @table(Scope)
EXEC sp_executesql @roles;
SELECT * FROM @table
DECLARE @roles NVARCHAR(MAX)=''
DECLARE @table TABLE
(
Scope NVARCHAR(MAX)
)
SELECT e.EmployeeId,
'Select '+isnull(er.ColumnName,'*')+' from '+er.SchemaName+'.'+er.TableName+' where '+kcu.COLUMN_NAME +'='+er1.ValueId
from [Function].[Role] er
left join INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc on
tc.TABLE_NAME=er.TableName and tc.TABLE_SCHEMA=er.SchemaName
left join INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu on kcu.CONSTRAINT_NAME=tc.CONSTRAINT_NAME
left JOIN Employee_Role er1 ON er.EntityRoleId = er1.RoleId
left JOIN Employee e ON er1.EmployeeId = e.EmployeeId
where e.EmployeeId=54 AND tc.CONSTRAINT_TYPE='PRIMARY KEY' AND er1.ValueId !=0 AND er1.ValueId IS NOT NULL
INSERT INTO @table(Scope)
EXEC sp_executesql @roles;
SELECT * FROM @table
这是我的输出:
当我尝试显示带有角色(范围)的员工ID
时,如下所示:
DECLARE @roles NVARCHAR(MAX)=''
DECLARE @table TABLE
(
Scope NVARCHAR(MAX)
)
SELECT @roles=@roles+ 'Select '+isnull(er.ColumnName,'*')+' from '+er.SchemaName+'.'+er.TableName+' where '+kcu.COLUMN_NAME +'='+er1.ValueId
from [Function].[Role] er
left join INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc on
tc.TABLE_NAME=er.TableName and tc.TABLE_SCHEMA=er.SchemaName
left join INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu on kcu.CONSTRAINT_NAME=tc.CONSTRAINT_NAME
left JOIN Employee_Role er1 ON er.EntityRoleId = er1.RoleId
left JOIN Employee e ON er1.EmployeeId = e.EmployeeId
where e.EmployeeId=54 AND tc.CONSTRAINT_TYPE='PRIMARY KEY' AND er1.ValueId !=0 AND er1.ValueId IS NOT NULL
INSERT INTO @table(Scope)
EXEC sp_executesql @roles;
SELECT * FROM @table
DECLARE @roles NVARCHAR(MAX)=''
DECLARE @table TABLE
(
Scope NVARCHAR(MAX)
)
SELECT e.EmployeeId,
'Select '+isnull(er.ColumnName,'*')+' from '+er.SchemaName+'.'+er.TableName+' where '+kcu.COLUMN_NAME +'='+er1.ValueId
from [Function].[Role] er
left join INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc on
tc.TABLE_NAME=er.TableName and tc.TABLE_SCHEMA=er.SchemaName
left join INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu on kcu.CONSTRAINT_NAME=tc.CONSTRAINT_NAME
left JOIN Employee_Role er1 ON er.EntityRoleId = er1.RoleId
left JOIN Employee e ON er1.EmployeeId = e.EmployeeId
where e.EmployeeId=54 AND tc.CONSTRAINT_TYPE='PRIMARY KEY' AND er1.ValueId !=0 AND er1.ValueId IS NOT NULL
INSERT INTO @table(Scope)
EXEC sp_executesql @roles;
SELECT * FROM @table
我的输出是空的。
预期产出:
在第二个查询中,您遗漏了以下内容:
...@roles=@roles+ ...
在第二个查询中,您遗漏了以下内容:
...@roles=@roles+ ...
我认为这与数据有关。尝试注释where子句,并仔细检查连接。但是,如果您可以提供一个示例数据,那么就很容易识别和解决这个问题?这是一个很大的危险信号,表明您的数据模式是问题的根源。@SeanLange我没有,我正在处理ETL。我只是从暂存区收集数据。我认为它与数据相关。尝试注释where子句,并仔细检查连接。但是,如果您可以提供一个示例数据,那么就很容易识别和解决这个问题?这是一个很大的危险信号,表明您的数据模式是问题的根源。@SeanLange我没有,我正在处理ETL。我只是从暂存区收集数据。如果我添加数据,我会得到以下错误“为变量赋值的SELECT语句不得与数据检索操作相结合”。您的方法存在根本性缺陷。您不能单独从
@roles
查询字符串中选择EmployeeID
,您必须找到一种方法将EmployeeID
包含在该字符串中。您的SELECT查询只需构造@roles
查询字符串,无需执行任何操作。如果添加该字符串,则会出现以下错误“为变量赋值的SELECT语句不得与数据检索操作相结合”。您的方法存在根本性缺陷。您不能单独从@roles
查询字符串中选择EmployeeID
,您必须找到一种方法将EmployeeID
包含在该字符串中。SELECT查询只需构造@roles
查询字符串。