1

如果我有这个表TableABC并且它有一些字段/列,而不是说它有很多字段/列col1, col2, col3.....说 upto 10or 20,那么计数现在并不重要。关键是,我想知道,如果我们要求用户输入,说@input varchar(max)或类似的东西,我想知道的是......

我如何选择一行,如果此输入出现在该行的任何列中,我的意思是如果col1=@input还有 ifcol2=@input等也会选择该行..

现在正如我所说的列数无关紧要,重要的是我们不提前知道列,以便我们可以做类似的事情

where
col1 = @input
or
col2 = @input

我们不能那样做。我已经通过说从表中获取列的名称

SELECT [name] FROM sys.Columns WHERE [Object_id]=Object_id(N'TableABC')

这会给我们所需表中的 col 名称,现在我不知道我们可以用它们做什么,或者这在我描述的场景中是否有用?那么,解决方案是什么?

最后,如果有人可能会问,我将在哪里使用它,或者我的要求是什么,让我明确它不是为了(至少到目前为止!)实际实施,我只是想知道它是否可能,如果是这样, 如何?我希望我说清楚了。

4

3 回答 3

1

您可以按照您的建议使用游标遍历列名,然后构建动态查询,稍后执行它,如下所示:

DECLARE @Expression varchar(max)
DECLARE @ColumnName varchar(max)
SELECT @Expression = 'WHERE '

DECLARE db_cursor CURSOR FOR SELECT [name] FROM sys.Columns WHERE [Object_id]=Object_id(N'TableABC')
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @ColumnName   

WHILE @@FETCH_STATUS = 0   
BEGIN
    SELECT @Expression = @Expression + @ColumnName + ' = ' + @input + ' AND '

    FETCH NEXT FROM db_cursor INTO @ColumnName   
END 

CLOSE db_cursor   
DEALLOCATE db_cursor

SELECT @Expression
-- EXEC(@Expression) etc...
于 2012-08-28T06:59:46.460 回答
0

您可以检查存储过程中的每一列并Where使用条件生成IF..ELSE条件:

if @Col1 is not null  
begin   
print 'type'
if @Cond is not null
    Set @Cond = @Cond + ' and '

    SET @Cond =@Cond + ' col1 =''' +@Col1 +''''  
end
于 2012-08-28T07:01:58.510 回答
0

如果您正在寻找在任何字段中修改了某些内容的客户,您应该考虑从表中选择 XML 文档,然后对文档进行一些操作。我附上了一个示例,您可以对其进行修改以达到您的目的。

我相信这里有很多 XML 专家可以更好地编写这个,但这是一般的想法。没有循环,没有游标。


/*
CREATE SOME DUMMY DATA */

CREATE TABLE _TEST (CustomerID int, COL1 varchar(255), COL2 varchar(255),COL3 varchar(255),COL4 varchar(255))

INSERT INTO _TEST SELECT 101, NULL, NULL, NULL, NULL INSERT INTO _TEST SELECT 102, NULL, NULL, NULL, NULL INSERT INTO _TEST SELECT 103, NULL, 'input test', NULL, NULL INSERT INTO _TEST SELECT 104, NULL, NULL, NULL, 'input test' INSERT INTO _TEST SELECT 105, NULL, NULL, NULL, NULL INSERT INTO _TEST SELECT 106, 'input test', NULL, NULL, NULL

/* FORM THE XML */

DECLARE @xmldoc XML

SET @xmldoc = (select * from _TEST FOR xml raw,root('Sample'))

/* GET THE CUSTOMERS THAT CHANGED SOMETHING IN ANY OF THE FIELDS */

SELECT CUSTOMERID FROM ( select X.value('@CustomerID[1]','int') as CUSTOMERID, X.query('count(@*[2])').value('.','int') as MODIFIED from @xmldoc.nodes('/Sample/row') as A(X) ) RES WHERE MODIFIED = 1

我希望这会有所帮助,丹

于 2012-08-28T13:00:29.933 回答