MSSQL通过SELECT TABLENAME语句查列名,请教?

byshuang 2018-10-11 02:01:54
目前有个需求是客户自定义的SQL语句如:SELECT ID,NAME FROM TABLE
这个语句能得知查的列明有ID,NAME
但是如果在这句话上再构造一下让返回的结果为ID和NAME呢?

SELECT XXX IN(
SELECT ID,NAME FROM TABLE
)
返回 ID,NAME
可以做到吗
...全文
327 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-10-11
  • 打赏
  • 举报
回复
引用 7 楼 byshuang 的回复:
十分感谢,因为赶时间还没事,我自己先执行了一次客户的SQL放在DataTable里,然后循环得到ColumnsName,再问一下题外话,你知道WPF的下拉框SelectedValueBinding绑定属性,怎么样能不区分大小写吗
直接放 DataTable 也可以。 不过, 还是应该在 原来的语句前面加上一句:

string sql = "SET ROWCOUNT 1;" + sql ;     //sql 为原来的客户的sql .
要不然, 一个表有 1 亿行, 不是得把你的服务器内存撑爆? WPF 没用过, 不好意思没那么多才。
byshuang 2018-10-11
  • 打赏
  • 举报
回复
引用 6 楼 yenange 的回复:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT PRIMARY KEY,
	[name] NVARCHAR(10),
	addTime DATETIME DEFAULT(GETDATE())
)
GO
INSERT INTO t(id,[name]) VALUES(1,'a')
INSERT INTO t(id,[name]) VALUES(2,'b')
INSERT INTO t(id,[name]) VALUES(3,'c')
GO

DECLARE @sql NVARCHAR(MAX)
DECLARE @tmp TABLE (colInfo NVARCHAR(MAX))
--客户原sql
SET @sql='SELECT id,[name] FROM t'

--------- 加工sql, 得到用户的列 --------------
SET @sql=
--限制只输出一行,避免数据集过大
'SET ROWCOUNT 1; '
+
--将 from 替换为 into #tmp FROM
STUFF(@sql,CHARINDEX('FROM',@sql),5,' into #tmp FROM ')
+
--查询得到的临时表的相关列
';
SELECT STUFF(
	(SELECT '',''+[name] FROM tempdb.sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID(''tempdb..#tmp'') FOR XML PATH(''''))
	,1,1,'''');
drop table #tmp;
'
PRINT @sql;
INSERT INTO @tmp
EXEC(@sql)

SELECT * FROM @tmp;
/*
colInfo
---------
id,name
 */
十分感谢,因为赶时间还没事,我自己先执行了一次客户的SQL放在DataTable里,然后循环得到ColumnsName,再问一下题外话,你知道WPF的下拉框SelectedValueBinding绑定属性,怎么样能不区分大小写吗
吉普赛的歌 2018-10-11
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT PRIMARY KEY,
	[name] NVARCHAR(10),
	addTime DATETIME DEFAULT(GETDATE())
)
GO
INSERT INTO t(id,[name]) VALUES(1,'a')
INSERT INTO t(id,[name]) VALUES(2,'b')
INSERT INTO t(id,[name]) VALUES(3,'c')
GO

DECLARE @sql NVARCHAR(MAX)
DECLARE @tmp TABLE (colInfo NVARCHAR(MAX))
--客户原sql
SET @sql='SELECT id,[name] FROM t'

--------- 加工sql, 得到用户的列 --------------
SET @sql=
--限制只输出一行,避免数据集过大
'SET ROWCOUNT 1; '
+
--将 from 替换为 into #tmp FROM
STUFF(@sql,CHARINDEX('FROM',@sql),5,' into #tmp FROM ')
+
--查询得到的临时表的相关列
';
SELECT STUFF(
	(SELECT '',''+[name] FROM tempdb.sys.[columns] AS c WHERE c.[object_id]=OBJECT_ID(''tempdb..#tmp'') FOR XML PATH(''''))
	,1,1,'''');
drop table #tmp;
'
PRINT @sql;
INSERT INTO @tmp
EXEC(@sql)

SELECT * FROM @tmp;
/*
colInfo
---------
id,name
 */
二月十六 版主 2018-10-11
  • 打赏
  • 举报
回复
引用 3 楼 byshuang 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
可以查询这个表的所有列名
SELECT name
FROM syscolumns
WHERE ID=object_id('表名')



我知道 但是要在 SELECT ID,NAME TABLE 做操作,因为我不知道这条SQL语句要查哪些列,并不是我定义的,是客户去定义的,我要做的就是把客户定义好的SQL语句的列名查出来,然后返回[/quote]

这个语句是怎么定义的?如果是一个文本框随便输入,那就没办法得到要查那些列,如果是这些列名都是输入的然后拼成的字符串,那就知道客户要查那些列了
byshuang 2018-10-11
  • 打赏
  • 举报
回复
引用 2 楼 yenange 的回复:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT PRIMARY KEY,
	[name] NVARCHAR(10),
	addTime DATETIME DEFAULT(GETDATE())
)
GO
INSERT INTO t(id,[name]) VALUES(1,'a')
INSERT INTO t(id,[name]) VALUES(2,'b')
INSERT INTO t(id,[name]) VALUES(3,'c')
GO

SELECT id,[name] FROM t
WHERE id IN (1,2)
/*
id          name
----------- ----------
1           a
2           b
 */
不需要倒行逆施, in 写后面不就好了?
谢谢,但是我想要的是返回的数据是列的名称,况且这个SQL语句我不知道需要找那些列,因为是客户去写的,我就是把客户的SQL语句中有的列给返回
byshuang 2018-10-11
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
可以查询这个表的所有列名
SELECT name
FROM syscolumns
WHERE ID=object_id('表名')

我知道 但是要在 SELECT ID,NAME TABLE 做操作,因为我不知道这条SQL语句要查哪些列,并不是我定义的,是客户去定义的,我要做的就是把客户定义好的SQL语句的列名查出来,然后返回
吉普赛的歌 2018-10-11
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
	id INT PRIMARY KEY,
	[name] NVARCHAR(10),
	addTime DATETIME DEFAULT(GETDATE())
)
GO
INSERT INTO t(id,[name]) VALUES(1,'a')
INSERT INTO t(id,[name]) VALUES(2,'b')
INSERT INTO t(id,[name]) VALUES(3,'c')
GO

SELECT id,[name] FROM t
WHERE id IN (1,2)
/*
id          name
----------- ----------
1           a
2           b
 */
不需要倒行逆施, in 写后面不就好了?
二月十六 版主 2018-10-11
  • 打赏
  • 举报
回复
可以查询这个表的所有列名
SELECT name
FROM syscolumns
WHERE ID=object_id('表名')

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧