未在 T-SQL 中创建动态列

2024-01-02

我有以下表格:

tbl工程查找专栏管理员

elccolumnid | elclookupcode | elccolumnname | elcisrequired

1             |   64              |   FirstName |      1
2             |   64              |   LastName  |      1
3             |   65              |   abc       |      1
4             |   65              |   xyz       |      1

tbl工程查找详细信息

eldrecordId | eldlookupcode |eldlookupsequence |eldlookupvalue | eldlookupvaluedescription

245     |     64        |    0         |   Red        |    Aravinth,Arumugam

246     |     64        |    1         |   Blue       |    Santhosh,Chandran

247     |     64        |    2         |   Green          |  Karthik,Balasubramanian

当我将“64”作为参数传递给过程时。 我得到的输出为:

FirstName | LastName        | eldRecordId  
-------------------------------------
Aravinth  |  Arumugam       | 245        
Santhosh  |  Chandran       | 246
Karthik   |  Balasubramanian| 247

使用的存储过程是

//SP

-- Select the columns to be used
DECLARE @tcol TABLE
(
      ID INT IDENTITY(1,1)
    , elclookupcode INT
    , elccolumnname VARCHAR(100)
)
-- Insert the records into the table
INSERT INTO @tcol (elclookupcode, elccolumnname)
SELECT elclookupcode,elccolumnname FROM tblEngineeringLookupColumnMaster WHERE elclookupcode=@LookupCode

-- Select the columns which should be as output as a table
DECLARE @temp TABLE
(
        elcLookupCode INT
      , RecordId INT
      , txt VARCHAR(8000)
)

-- Select the records from the table and insert
INSERT INTO @temp (elcLookupCode, RecordId, txt)
SELECT eldLookupCode,eldRecordId, eldLookupValueDescription FROM tblEngineeringLookupDetail WHERE eldLookupCode=@LookupCode

DECLARE @SQL NVARCHAR(MAX)

-- Have a table for the selected values
;WITH cte AS 
(
    SELECT 
          token = ', [' + d2.elccolumnname + '] = ''' + d.token + ''''
        , d.RecordId
    FROM (
        SELECT 
              token = t.c.value('.', 'VARCHAR(50)')
            , a.RecordId
            , a.elcLookupCode
            , rn = ROW_NUMBER() OVER (PARTITION BY a.RecordId ORDER BY a.RecordId)
        FROM (
            SELECT 
                  RecordId
                , elcLookupCode
                , txml = CAST('<t>' + REPLACE(txt, ',', '</t><t>') + '</t>' AS XML)
            FROM @temp
        ) a
        CROSS APPLY txml.nodes('/t') t(c)
    ) d
    -- Select the columns to be mapped
   JOIN (
        SELECT 
              elclookupcode
            , elccolumnname
            , rn = ROW_NUMBER() OVER (PARTITION BY elclookupcode ORDER BY elclookupcode) 
        FROM @tcol 
    ) d2 ON d.elcLookupCode = d2.elclookupcode AND d2.rn = d.rn
)
-- Join all the records taken
SELECT @SQL = STUFF((
        SELECT CHAR(13) + 'UNION ALL SELECT  '+ STUFF((
        SELECT t2.token
        FROM cte t2
        WHERE t2.RecordId = t.RecordId
        FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, ''), ',[RecordId] = ' + CAST(RecordId AS VARCHAR(10)) 
        FROM @temp t
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 11, '')

PRINT @SQL
EXEC sp_executesql @SQL
END

现在的问题是:

如果我将“65”作为参数传递给过程,其中第一个表中有值(tblengineeringlookupcolumnmaster)并且第二个表中没有对应的值(tblengineeringlookupdetail)我没有得到任何结果(一条消息显示3rows affected).

但我必须得到columns单独的标题。

'Sample:

xyz  | abc  | eldrecordId

NULL |NULL | NULL

为什么我没有得到这个?我哪里错了?


试试这个——

DECLARE @tcol TABLE
(
      ID INT IDENTITY(1,1)
    , elclookupcode INT
    , elccolumnname VARCHAR(20)
)

INSERT INTO @tcol (elclookupcode, elccolumnname)
VALUES 
    (65, 'FirstName'),
    (65, 'LastName')

DECLARE @temp TABLE
(
        elcLookupCode INT
      , eldRecordId INT
      , txt VARCHAR(100)
)

INSERT INTO @temp (elcLookupCode, eldRecordId, txt)
VALUES 
    (64, 245, 'Aravinth,Arumugam'),
    (64, 246, 'Santhosh,Chandran'),    
    (64, 247, 'Karthik,Balasubramanian')

DECLARE @SQL NVARCHAR(MAX)

;WITH cte AS 
(
    SELECT 
          token = ', [' + d2.elccolumnname + '] = ''' + d.token + ''''
        , d.eldRecordId
    FROM (
        SELECT 
              token = t.c.value('.', 'VARCHAR(50)')
            , a.eldRecordId
            , a.elcLookupCode
            , rn = ROW_NUMBER() OVER (PARTITION BY a.eldRecordId ORDER BY a.eldRecordId)
        FROM (
            SELECT 
                  eldRecordId
                , elcLookupCode
                , txml = CAST('<t>' + REPLACE(txt, ',', '</t><t>') + '</t>' AS XML)
            FROM @temp
        ) a
        CROSS APPLY txml.nodes('/t') t(c)
    ) d
    LEFT JOIN (
        SELECT 
              elclookupcode
            , elccolumnname
            , rn = ROW_NUMBER() OVER (PARTITION BY elclookupcode ORDER BY elclookupcode) 
        FROM @tcol 
    ) d2 ON d.elcLookupCode = d2.elclookupcode AND d2.rn = d.rn
)
SELECT @SQL = STUFF((
        SELECT CHAR(13) + 'UNION ALL SELECT [eldRecordId] = ' + CAST(eldRecordId AS VARCHAR(10)) + ', ' + 
           '[elcLookupCode] = ' + CAST(elcLookupCode AS VARCHAR(10)) + ISNULL(STUFF((
        SELECT t2.token
        FROM cte t2
        WHERE t2.eldRecordId = t.eldRecordId
        FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, ', '), '')
        FROM @temp t
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 11, '')

PRINT @SQL
EXEC sys.sp_executesql @SQL
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未在 T-SQL 中创建动态列 的相关文章

  • 使用触发器找出哪些行被插入、更新或删除

    我在数据库中有一个名为指示的表 它有三列Name Age and Enable 我想创建一个触发器 每当Age未满 18 岁并且Enable是真的 我想在插入的那一刻检查指示表上的记录 这样我就可以检查是否应该在报警时插入 I found
  • 在 SQLite 数据库的特定位置插入一行

    我正在 SQLite Manager 中创建数据库 并且错误地忘记提及一行 现在 我想在中间手动添加一行 在其下方 其余的自动增量键应自动增加 1 我希望我的问题很清楚 Thanks 您不应该关心键值 只需在末尾附加行即可 如果您确实需要这
  • 我需要进行哪些更改才能让我的表在 AppEngine 的 BigTable 上运行?

    假设我有一个预订数据库 其中包括users user id fname lname 和他们的tickets ticket id user id flight no 以及相关的flights flight no airline departu
  • 从关键字后的文本中提取字符串

    我想从 SQL 字段中关键字后面的文本中提取内容 我有一个名为Description在表中 该字段的内容是 asdasf 关键字 狗 aeee 关键字 猫 ffffaa 关键词 狼 我想提取并保存 关键字 之后的文本 在本例中dog cat
  • 表值函数降低了我的查询性能

    今天我在尝试让查询按照我期望的方式执行时经历了一段可怕的时光 我不得不对昨天查询中的表值函数进行轻微更改 该更改对查询产生了巨大的性能影响 在评估执行计划并查看统计 IO 和时间后 我发现因为我更改了函数以返回表变量而不仅仅是结果集 所以它
  • PHP/MySQL - 在数据库中存储数组

    我正在开发一个 PHP 应用程序 它需要将各种设置存储在数据库中 客户经常询问是否可以添加或更改 删除某些内容 这导致了表格设计出现问题 基本上 我有很多布尔字段 它们只是指示是否为特定记录启用了各种设置 为了避免再弄乱表格 我正在考虑将数
  • MySQL表按时间戳分区

    我已经对表进行了分区 由于内存不足错误 表太大 我已将其分区在时间戳列上 如下所示 CREATE TABLE test fname VARCHAR 50 NOT NULL lname VARCHAR 50 NOT NULL dob time
  • 带外键或不带外键的引用有什么区别

    关于SQLite 带外键或不带外键的引用有什么区别 这有什么区别 CREATE TABLE players set id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL player id INTEGE
  • C# 通过实体框架调用 SQL Server 用户定义的函数

    我不敢相信我必须问这个问题 但我被困住了 我花了三个小时试图解决这个问题 但我被困住了 我可以在以前版本的 C 中执行此操作 但我卡住了 在继续之前 我正在研究堆栈 视觉工作室2012 SQL Server 2012 NET Framewo
  • SQL Server 2008 R2 中的字符映射/逐字符搜索和替换

    我在 SQL Server 2008 R2 上运行 我们在这里有一个要求 即我需要创建将某些英文字符替换为以前在遗留系统中使用的区域设置语言字符 为此 我可能会使用 T SQL 中的替换函数 但在我的实践中 我们会逐个字符地替换 例如 AS
  • 计算日期范围内的天数以及可能重叠的排除集

    给定以下示例查询 考虑到这些范围可能具有重叠的日期 并且还给出了一组要排除的范围 那么计算日期范围内的总天数的合理且高效的方法是什么 更简单地说 我有一个表 其中包含一组关闭计费的日期范围 我从一个日期范围 例如 Jan1 Jan31 开始
  • 具有自定义格式的 C# Generic DateTime.ToString() [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 使用时 DateTime ToString Contains 2016 实体框架产生 CAST DateValue AS nvarchar
  • 条件聚合性能

    让我们有以下数据 IF OBJECT ID dbo LogTable U IS NOT NULL DROP TABLE dbo LogTable SELECT TOP 100000 DATEADD day ABS CHECKSUM NEWI
  • SELECT * FROM (VALUES (x,y)) AS TableLiteral(Col1, Col2) 的名称

    以下是有效的 SQL 语法 SELECT FROM VALUES p q x y AS TableLiteral Col1 Col2 并返回表 Col1 Col2 1 p q 2 x y 此语法可以进一步用于 CTE 等 这个有名字吗 我通
  • 带逗号和句点的 SQL Server 2005 货币格式

    有没有办法在 SQL Server 2005 中转换货币字段以对其进行格式化 例如 该字段包含 99966 00 我们希望以这种格式返回 99 966 00 convert varchar cast SalesProducts Price
  • 将 SQL Server 2008 查询分成多个批次

    我正在尝试准备一些数据供第三方删除 不幸的是他们只能批量处理 2000 条记录的数据 我有 100k 条记录 可能需要多次分割和导出这些数据 所以我想以某种方式自动化该过程 有没有一种相当简单的方法可以使用 SQL Server 2008
  • MYSQL 语法在存在 NULL 时不评估不等于

    我在 mysql 查询时遇到问题 我想排除 2 的值 所以我想我会执行以下操作 table products id name backorder 1 product1 NULL 2 product2 NULL 3 product3 2 SE
  • 带触发器的物化视图?

    我可以在物化视图上创建触发器吗 我用的是甲骨文10g 是的你可以 请小心 这是什么Oracle 文档 http download oracle com docs cd B19306 01 server 102 b14200 statemen
  • 存储过程和视图有什么区别?

    我对以下几点感到困惑 存储过程和视图有什么区别 在 SQL Server 中 什么时候应该使用存储过程 什么时候应该使用视图 视图是否允许创建可以传递参数的动态查询 哪一个最快 基于什么原因其中一个比另一个更快 视图或存储过程是否永久分配内
  • SQL 中 NOT 和 != 运算符有什么区别?

    有什么区别NOT and SQL 中的运算符 我无法理解其中的区别 我猜他们是一样的 NOT negates以下条件 因此它可以与各种运算符一起使用 is the 非标准替代品 https stackoverflow com a 10650

随机推荐

  • 如何通过 Intent 在 Android 中打开文件

    如何打开以前存储在 私有 文件系统中的文件 该文件正在由网络服务下载 并应存储在本地文件系统上 尝试通过意图 Action View 打开文件时出现 奇怪 错误 尽管该文件存在于文件系统中 在模拟器 Eclipse 的文件资源管理器中看到该
  • 如何获取导航抽屉中的项目以更改视图

    我想制作一个带有导航抽屉的简单应用程序 它可以打开其他视图 新闻 信息 图库 联系人等 所以我打开了最新的Android Studio 做了一个兼容API8 gt API19的新项目 以获得最大的覆盖范围 我选择了预设的导航抽屉并单击完成
  • 在 Windows 服务中使用 OWIN 托管 WebAPI

    我使用 OWIN 自托管 Web API 在 Windows 服务内 据我了解 这足以使 HTTP 请求到达 Windows 服务 我可以访问 WebAPI URL http localhost users 本地 来自同一台机器 但不是来自
  • Spring @Transactional Timeout 未按预期工作

    我有一个 JDBC 批量更新操作 可能需要很长时间 因此我使用事务超时来处理这个问题 Override Transactional propagation Propagation REQUIRES NEW timeout 10 public
  • Android布局:如何实现类似一副纸牌的UI?

    我需要实现一个类似于 Google Chrome 的选项卡堆栈的布局 如下所示 有可用的库吗 您需要为卡片的每个方面创建一组自定义可绘制对象 并在布局中使用它们 您可以使用表格布局来实现此目的 例如 要放置带角的背景 您可以创建一个可绘制对
  • 一阶逻辑引擎

    我想创建一个可以使用一阶逻辑进行简单推理的应用程序 谁能推荐一个可以接受任意数量的 FOL 表达式并允许查询这些表达式 最好通过 Python 访问 的 引擎 除非绝对必要 否则不要使用一阶逻辑 FOL 进行查询 一阶逻辑不可判定 而只是半
  • Parsley:按下提交以外的按钮时如何防止验证?

    感谢您的任何帮助 我正在尝试使用欧芹进行表单验证 我的表单有一个提交按钮和一些其他按钮 用于动态向表单添加输入 但是当我按下这些其他按钮时 就会执行表单验证 但我没有提交任何表格 当我按提交按钮以外的其他按钮时 如何防止发生表单验证 抱歉
  • 将packages.config更改为somethingelse.config

    我创建了一个 ASP NET MVC 4 5 应用程序 现在我想将packages config更改为mypackages1 config 文件的简单重命名 我编辑了 csproj 文件并按照提到的方式重命名 我如上所述重命名了packag
  • NSButton RadioGroup(NSMatrix 替代方案)

    我已经尝试了几次设置几个类似的按钮 所有按钮都连接到相同的 IBActions 但似乎仍然无法复制 RadioButton 行为 目前 我有 5 个 Button 它们都是一个 NSView 的子级 NSView ButtonOne NSB
  • Windows Phone 8.1 的 SQLite.Net PCL 支持/解决方法

    我有一个 WIndows Phone 8 1 应用程序 我想在此处使用 SQLite Net PCL 库分叉 oysteinkrog https github com oysteinkrog SQLite Net PCL https git
  • 二元运算“==”不能应用于类型X

    我有一个自定义类型 pub struct PValue pub name String pub value Option
  • Delphi错误E2010不兼容的类型:'字符串'和'过程,无类型指针或无类型参数'

    我使用了 TStringList 和类似的东西 geo TStringList response TStringStream begin http tidhttp Create nil try TODO oUser cConsole Mai
  • 对于 ListBox1 中的每个项目执行一些操作,然后将项目添加到 listbox2 vb

    我制作了一个应用程序来将某些数字转换为其他格式 i e 1 A 2 B 3 C 4 D 5 E ETC 我已经毫无问题地实现了该功能 并且已经使用它相当长一段时间了 但现在我想更快地批量完成操作 所以对我来说 从文本文件复制到 Textbo
  • Spring-WS无需操作即可生成WSDL

    Spring WS生成WSDL时不需要绑定标签中的操作 你知道为什么吗 有我的 spring ws service xml
  • 使用 http 的 Range 标头下载视频的后半部分

    我想下载本地主机上视频的后半部分 我编写了一些 python 代码来下载从一半到结尾的文件 通过 http 的 Range 标头 但是当我用 vlc 打开文件时 没有任何反应 所以它不起作用 如何下载 mp4 文件的一部分并且仍然能够观看它
  • 如何选择statsmodels STL函数的正确参数?

    我一直在阅读有关时间序列分解的内容 并且非常了解它如何在简单的示例中工作 但在扩展这些概念时遇到了困难 例如 我正在使用一些简单的合成数据 因此 没有与该数据相关的实际时间 可以每秒或每年采样一次 无论采样频率如何 周期大约为 160 个时
  • 返回 ICollection 相对于 List 的优点是什么[重复]

    这个问题在这里已经有答案了 可能的重复 List of T 和 Collection of T 有什么区别 https stackoverflow com questions 398903 what is the difference be
  • 在 Matlab 中创建多个具有相同比例的箱线图

    我想在 Matlab 中绘制几个不同的箱线图 但给它们相同的比例 这样读者就不会因为并排比较它们而被误导 我尝试过使用 datalim 选项 但它只对箱线图施加上限 但如果数据未达到上限 则不会拉伸它 有任何想法吗 尝试 linkaxes
  • 在 iOS 7 中的 Alamofire 中设置自定义 HTTP 标头不起作用

    我尝试过设置Alamofire Manager sharedInstance session configuration HTTPAdditionalHeaders我在 iOS 7 中使用了自定义 HTTP 标头 但我没有运气 这在 iOS
  • 未在 T-SQL 中创建动态列

    我有以下表格 tbl工程查找专栏管理员 elccolumnid elclookupcode elccolumnname elcisrequired 1 64 FirstName 1 2 64 LastName 1 3 65 abc 1 4