Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL根据数字查询列_Sql_Sql Server_Tsql - Fatal编程技术网

如何使用SQL根据数字查询列

如何使用SQL根据数字查询列,sql,sql-server,tsql,Sql,Sql Server,Tsql,考虑下表,假设我们得到了一个数字 假设是2,我们想找到列name中的所有行,该列以结尾 和2。在本例中为b2 Personid Ac1 b2 yt3 =============================== 1 Red small 54 2 Green Big 22 3 Red Big 21 到目前为止,我还没有找到答案。(每个列名都以一个唯一的数字结尾)

考虑下表,假设我们得到了一个数字

假设是2,我们想找到列name中的所有行,该列结尾 和2。在本例中为b2

Personid  Ac1     b2         yt3
 ===============================
      1   Red     small      54
      2   Green   Big        22
      3   Red     Big        21

到目前为止,我还没有找到答案。(每个列名都以一个唯一的数字结尾)

您可以通过一些技巧使用动态查询来实现这一点。 您使用xml技巧从该表的信息架构表中获取列,格式为
b2,d2
,然后用该字符串替换
*
,结果是
从TestColumns
中选择b2,d2。将此语句传递给
EXEC
函数:

CREATE TABLE TestColumns
    (
      a1 INT ,
      b2 INT ,
      c3 INT ,
      d2 INT
    )
GO

INSERT  INTO TestColumns
VALUES  ( 1, 1, 1, 1 ),
        ( 2, 2, 2, 2 )


DECLARE @s NVARCHAR(MAX) = 'select * from TestColumns'
DECLARE @cols NVARCHAR(MAX) = ( SELECT  STUFF(( SELECT  ',' + COLUMN_NAME AS [text()]
                                                FROM    INFORMATION_SCHEMA.COLUMNS
                                                WHERE   TABLE_NAME = 'TestColumns'
                                                        AND COLUMN_NAME LIKE '%2'
                                              FOR
                                                XML PATH('')
                                              ), 1, 1, '')
                              )


SET @s = REPLACE(@s, '*', @cols)

EXEC  (@s)    
输出:

b2  d2
1   1
2   2
如果有唯一的索引列,则可以简化为:

DECLARE @s NVARCHAR(MAX) = 'select * from TestColumns'
DECLARE @col NVARCHAR(MAX) = ( SELECT   COLUMN_NAME
                               FROM     INFORMATION_SCHEMA.COLUMNS
                               WHERE    TABLE_NAME = 'TestColumns'
                                        AND COLUMN_NAME LIKE '%2'
                             )

SET @s = REPLACE(@s, '*', @col)

EXEC  (@s)   

我使用以下查询:

DECLARE @Str nvarchar(max) = 'SELECT '
DECLARE @TableName varchar(max) = 'yourTable', @PostFix int = 2

SELECT 
    @Str = @Str + '[' + t.name + '].[' + c.name + '],'
FROM 
    sys.tables t 
    LEFT OUTER JOIN
    sys.columns c ON t.[object_id] = c.[object_id]
WHERE 
    t.name = @TableName
    AND 
    c.name like '%' + CAST(@PostFix AS varchar(2))

SET @Str = SUBSTRING(@Str, 1, LEN(@Str) - 1) + ' FROM ' + @TableName

EXEC(@Str)

您必须使用动态SQL。我需要以某种方式查找列名,然后查看哪一个以2Yes结尾,而您无法在查询中“查找列名”。您需要在元数据中找到列名(
sys.columns
),然后使用dynamic SQL.Hmmm构建一个查询,为什么不呢?我知道它们都在一个系统表中。因为T-SQL不是这样工作的-您最终提交给SQL Server的查询中的列和其他实体名需要定义良好。您需要动态地构建查询;您不能仅将表与系统目录联接以确定在运行时返回哪些列。您可能需要考虑不同的设计。这可以更简单,因为OP声明每个列名称以唯一的编号结束,因此不会有<代码> B2 < /代码>和<代码> D2< /代码>。