sql - 如何传递包含在 SQL Server 中声明的变量中的列
问题描述
我有一个Depots
看起来像这样的表:
仓库编号 | 仓库名称 | 仓库位置 | 别名 |
---|---|---|---|
1 | 欧兰 | 实用性 | 欧拉 |
2 | 英格里 | 实用性 | 英格拉斯 |
3 | 土耳其人 | 实用性 | 图尔库 |
4 | 夯实 | 乌西马 | 坦佩雷 |
5 | 科科斯 | 乌西马 | 科库拉 |
6 | 考斯 | 奥隆巴 | 考卡纳 |
我在声明的变量中存储了一个逗号分隔的列列表@ValList
DECLARE @ValList varchar(8000);
SET @ValList = NULL
SELECT @ValList = COALESCE(@ValList + ', ','') + ColumnName
FROM #list
@ValList
返回DepotID, DepotName, DepLocation
我想传入@ValList
如下的选择语句
SELECT @ValList FROM Depots
所以我得到
仓库编号 | 仓库名称 | 仓库位置 |
---|---|---|
1 | 欧兰 | 实用性 |
2 | 英格里 | 实用性 |
3 | 土耳其人 | 实用性 |
4 | 夯实 | 乌西马 |
5 | 科科斯 | 乌西马 |
6 | 考斯 | 奥隆巴 |
但我不断得到类似的东西
(无列名) |
---|
仓库 ID、仓库名称、仓库位置 |
仓库 ID、仓库名称、仓库位置 |
仓库 ID、仓库名称、仓库位置 |
仓库 ID、仓库名称、仓库位置 |
仓库 ID、仓库名称、仓库位置 |
仓库 ID、仓库名称、仓库位置 |
我究竟做错了什么?
解决方案
不确定您可以或应该信任多少列列表的来源,但最安全的方法如下,您可以在其中检查每个列是否存在sys.columns
:
CREATE TABLE #list(ColumnName sysname);
INSERT #list(ColumnName)
VALUES(N'DepotID'),(N'DepotName'),(N'DepLocation');
DECLARE @sql nvarchar(max), @cols nvarchar(max) = N'';
SELECT @cols += N',' + QUOTENAME(c.name)
FROM #List AS l
INNER JOIN sys.columns AS c
ON l.ColumnName = c.name
WHERE c.[object_id] = OBJECT_ID(N'dbo.Depots');
SET @sql = N'SELECT ' + STUFF(@cols, 1, 1, N'')
+ N' FROM dbo.Depots';
EXEC sys.sp_executesql @sql;
推荐阅读
- datetime - Cassandra:如何在行插入或更新时在表上创建触发器
- excel - 尝试将行粘贴到数据集中时出现“对象'_Worksheet的方法'范围'失败”错误
- c# - ASP.NET Core 如何将上传的文件转换为 Pdf?
- sql - Azure SQL:获取列的所有 JSON 值
- string - 如何在 rust 中创建固定大小的可变堆栈分配字符串?
- python - 如何矢量化这个熊猫函数?
- identity - ASP.NET 核心身份登录是否可以在没有在子域上设置 COOKIES 的情况下工作?
- python - 有没有办法用相邻值替换列表中的特定值?
- amazon-web-services - 如何在主体标签的 IAM 策略中应用通配符 (?)?
- swift - 在多边形内创建一个洞 - Google Maps Swift