1

このテーブルがあり、いくつかのフィールド/列がある場合、またはまでTableABCの多くのフィールド/列があるcol1, col2, col3.....と言うと、カウントは今のところ問題ではありません。ポイントは、私が知りたいのは、ユーザーに入力を求める場合、たとえば、このようなことをした場合、私が知りたいのは..1020@input varchar(max)

行を選択するにはどうすればよいですか。この入力がその行の任意の列で発生した場合、行が選択されることを意味col1=@inputcol2=@inputます..

列の数は重要ではないと言ったように、重要なのは、次のようなことを行うために列を事前に知らないことです。

where
col1 = @input
or
col2 = @input

それはできません。私は言うことでテーブルから列の名前を取得するところまで行きました

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

これにより、必要なテーブルの列の名前が得られますが、それらで何ができるかわかりません。または、これは私が説明しているシナリオでも役立ちますか? それで、解決策は何ですか?

最後に、誰かがそれをどこで使用するのか、または私の要件や何かを尋ねる可能性がある場合に備えて、(少なくとも今のところ!) 実用的な実装ではないことを明確にさせてください。 、 どうやって?私は自分自身を明確にしたことを願っています。

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 に答える