Tsql 根据用户输入检索/显示列

Tsql 根据用户输入检索/显示列,tsql,select,ssms,Tsql,Select,Ssms,我有两张桌子 MainTable 字段\u激活 我将在ASP.NET中构建一个页面,用户可以从中查看MainSampleTable中的所有记录 但是,(由于GDPR),我必须构建一个存储过程,使用户能够从该页面(可能从下拉列表)选择一个类别。当用户选择Category 1时,我需要将Category Id与用户选择的内容匹配的IsActive列字段设置为1。因此,如果用户选择1,其中类别Id=1,则IsActive应=1(真)(字段激活表) 发生这种情况时,我需要从主示例表中选择/显示与字段

我有两张桌子

MainTable

字段\u激活

我将在ASP.NET中构建一个页面,用户可以从中查看MainSampleTable中的所有记录

但是,(由于GDPR),我必须构建一个存储过程,使用户能够从该页面(可能从下拉列表)选择一个类别。当用户选择Category 1时,我需要将Category Id与用户选择的内容匹配的IsActive列字段设置为1。因此,如果用户选择1,其中类别Id=1,则IsActive应=1(真)(字段激活表)

发生这种情况时,我需要从主示例表中选择/显示与字段激活表中字段名的名称相匹配的列,这些字段名在IsActive中的值为1

这是到目前为止我的代码

DECLARE @category INT = 1

                --Set Default Values (All disabled (false) until user selects a category)
                UPDATE Company.FileExtraction.FIELDS_ACTIVATION
                SET IsActive = 0

                --If Category is 1, Set IsActive to 1, Where CategoryId is 1 in FIELDS_ACTIVATION table
                IF OBJECT_ID('tempdb..#CatOneTemp') IS NOT NULL DROP TABLE #CatOneTemp
                IF @category = 1
                    BEGIN
                        UPDATE Company.FileExtraction.FIELDS_ACTIVATION
                        SET IsActive = 1
                        WHERE CategoryID = 1

                        --Select appropriate fields and put into temp table
                        SELECT REPLICATE('0', 10-LEN(EM.ColumnA)) + EM.ColumnA AS PolicyNumber,
                               REPLICATE('0', 7-LEN(ColumnB)) + ColumnB AS BOCBranch,
                               ColumnC + REPLICATE(' ', 10-LEN(ColumnC)) AS ContributionCode
                        INTO #CatOneTemp
                        FROM Company.FileExtraction.MainTable EM

                        SELECT * FROM #CatOneTemp
                    END
我不能加入表格,因为我没有共同点这样做。我尝试过使用子查询,但我不知道如何形成这种查询

我忍不住认为有更好的方法来解决这个问题,但是这个方法是别人给我的,我不能反对。就个人而言,我更希望当用户选择一个时,选择columnA和columnB,当选择2时,选择columnC和columnD,而不选择IsActive列。但是指令就是指令。这显然是有原因的

编辑

我已经更新了代码。 仅当字段激活表中的
IsActive
列为1时,我希望当前代码执行
SELECT
,并且仅针对与MainSampleTable中的列名匹配的
FieldNames

基本上,我需要
IsActive=1
作为
SELECT
语句的强制条件

我也在这里进行了检查,但这需要两个表有一个公共字段。(例如,type_id)。那篇文章中的想法正是我想要的


希望这是有意义的,如果有任何不合理的地方,很高兴作出澄清。

好吧,这并不漂亮,但至少会得到你想要的答案:

SELECT *
INTO #MainSampleTable
FROM (SELECT 'John' AS ColumnA, 'Doe' AS ColumnB, 'Clark St.' AS ColumnC, 'Telford' AS ColumnD, 'UK' AS ColumnE, '2300' AS ColumnF UNION ALL
SELECT 'Jane' AS ColumnA, 'Doe' AS ColumnB, 'Lister gdns.' AS ColumnC, 'London' AS ColumnD, 'UK' AS ColumnE, '2300' AS ColumnF UNION ALL
SELECT 'John' AS ColumnA, 'Smith' AS ColumnB, 'Clurk St.' AS ColumnC, 'Bradford' AS ColumnD, 'UK' AS ColumnE, '2300' AS ColumnF UNION ALL
SELECT 'John' AS ColumnA, 'Jones' AS ColumnB, 'Clork St.' AS ColumnC, 'Tellane' AS ColumnD, 'UK' AS ColumnE, '2325' AS ColumnF UNION ALL
SELECT 'John' AS ColumnA, 'Long' AS ColumnB, 'Clyrk St.' AS ColumnC, 'Ford' AS ColumnD, 'UK' AS ColumnE, '2350' AS ColumnF
) AS Names;


SELECT *
INTO #FieldActivationSample
FROM (SELECT '1' AS CategoryId, 'ColumnA' AS FieldName, 0 AS IsActive UNION ALL
SELECT '1' AS CategoryId, 'ColumnB' AS FieldName, 0 AS IsActive UNION ALL
SELECT '2' AS CategoryId, 'ColumnC' AS FieldName, 0 AS IsActive UNION ALL
SELECT '2' AS CategoryId, 'ColumnD' AS FieldName, 0 AS IsActive UNION ALL
SELECT '3' AS CategoryId, 'ColumnE' AS FieldName, 0 AS IsActive UNION ALL
SELECT '3' AS CategoryId, 'ColumnF' AS FieldName, 0 AS IsActive 
) AS Fields;



    --User input parameter
DECLARE @categoryId VARCHAR(1) = '1'

--If User selects 1 set IsActive to 1 Where Field Name = 'ColumnA' and 'ColumnB'
IF @categoryId = '1'
UPDATE #FieldActivationSample
SET IsActive = 1
WHERE FieldName IN ('ColumnA', 'ColumnB');


--This is where I am stuck

--Select the columns from MainSampleTable, 
--which have names that match values in the FieldName column,
--that have an IsActive status of 1, 
--from the FieldActivationTable
DECLARE @FieldList varchar(1000);
DECLARE @DynamicFields nvarchar(4000);
SELECT @FieldList = Stuff((Select ',' +replace(FieldName,'z','')
FROM (SELECT FieldName 
        FROM #FieldActivationSample
        WHERE IsActive = 1                      
      ) C1
FOR XML PATH ('')),1,1,'');

SET @DynamicFields = 'SELECT ' + @FieldList + ' FROM #MainSampleTable';

EXECUTE sp_executesql @DynamicFields;


DROP TABLE #MainSampleTable;
DROP TABLE #FieldActivationSample;

我有一个简化的解决方案。我认为您需要的是能够使用FieldActivationSample表为查询缝合列。为此,您需要创建一个动态查询。动态查询列使用Quotename,并带有一个逗号,您必须删除该逗号,然后运行它。 让我知道它是否有效

CREATE TABLE MainSampleTable (ColumnA varchar(20), ColumnB varchar(20),  ColumnC varchar(20), ColumnD varchar(20), ColumnE varchar(20),  ColumnF varchar(20))
INSERT INTO MainSampleTable
SELECT 'John', 'Doe', 'Clark St.', 'Telford', 'UK', '2300' UNION ALL
SELECT 'Jane', 'Doe', 'Lister gdns.', 'London', 'UK', '2300' UNION ALL
SELECT 'John', 'Smith', 'Clurk St.', 'Bradford', 'UK', '2300' UNION ALL
SELECT 'John', 'Jones', 'Clork St.', 'Tellane', 'UK', '2325' UNION ALL
SELECT 'John', 'Long', 'Clyrk St.', 'Ford', 'UK', '2350'

CREATE TABLE FieldActivationSample (CategoryId INT, FieldName varchar(50), IsActive BIT)
INSERT INTO FieldActivationSample
SELECT '1', 'ColumnA', 1 UNION ALL
SELECT '1', 'ColumnB', 1 UNION ALL
SELECT '2', 'ColumnC', 0 UNION ALL
SELECT '2', 'ColumnD', 0 UNION ALL
SELECT '3', 'ColumnE', 0 UNION ALL
SELECT '3', 'ColumnF', 0 



--Ability to use a table to stitch columns using dynamic query --
DECLARE @ColumnList nvarchar(1000)=(SELECT Quotename(FieldName) + ',' FROM FieldActivationSample WHERE IsActive=1 FOR xml path(''))--- @Column List
SELECT @ColumnList = LEFT(@ColumnList, Len(@ColumnList) - 1)  --- Remove comma
--Generate Query ----
DECLARE @Dynamicsql nvarchar(1000)   = 'SELECT ' + @ColumnList + ' FROM MainSampleTable '
--Test Query  ---
PRINT (@Dynamicsql) 
--To run--
EXEC(@DynamicFields)

实际的MainTable有数百行,因此手动添加每个条目是不可撤消的。我在这里展示的表格是代表总体想法的示例。在帖子中添加了澄清。临时表格听起来是个好主意。临时表格只是为了让我能给出我的答案。您只需使用原始“这是我被卡住的地方”注释下面的部分。好的。升降台怎么样?我不想删除任何表。按照我提供答案的方式,您应该能够将其加载到任何服务器,以测试我的答案是否有效。Drop table语句也适用于此示例,因此您可以在完成测试后删除临时表。Ok。我一周后回来上班。我试试看,然后再打给你。好的。我一周后回办公室。我到时候再发。得到这样的结果:“必须声明标量变量“@DynamicFields.”和2。您告诉我从中删除逗号的行没有可删除的逗号。您指的是什么逗号?您好,NikosV,本节(第24行)声明并分配“@DynamicFields”-声明@Dynamicsql nvarchar(1000)=“SELECT”…当您使用quotename函数时,@ColumnList变量中还添加了一个逗号。带有“---删除逗号”的节删除它。不幸的是,所有解决方案都不起作用。我正在尝试其他方法,并相应地更新了代码。