【发布时间】:2012-07-01 13:39:43
【问题描述】:
我需要为我正在构建的 java 应用程序创建一个搜索,用户可以在其中根据他们当前正在查看的表和他们提供的搜索词搜索 SQL 数据库。一开始我打算做这样简单的事情:
SELECT * FROM <table name> WHERE CAST((SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table name>')
AS VARCHAR) LIKE '%<search term>%'
但是该子查询返回多个结果,因此我尝试创建一个过程来遍历给定表中的所有列,并将任何相关字段放入结果表中,如下所示:
CREATE PROC sp_search
@tblname VARCHAR(4000),
@term VARCHAR(4000)
AS
SET nocount on
SELECT COLUMN_NAME
INTO #tempcolumns
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tblname
ALTER TABLE #tempcolumns
ADD printed BIT,
num SMALLINT IDENTITY
UPDATE #tempcolumns
SET printed = 0
DECLARE @colname VARCHAR(4000),
@num SMALLINT
WHILE EXISTS(SELECT MIN(num) FROM #tempcolumns WHERE printed = 0)
BEGIN
SELECT @num = MIN(num)
FROM #tempcolumns
WHERE printed = 0
SELECT @colname = COLUMN_NAME
FROM #tempcolumns
WHERE num = @num
SELECT * INTO #results FROM @tblname WHERE CAST(@colname AS VARCHAR)
LIKE '%' + @term + '%' --this is where I'm having trouble
UPDATE #tempcolumns
SET printed = 1
WHERE @num = num
END
SELECT * FROM #results
GO
这有两个问题:首先是它以某种方式陷入了无限循环,其次我无法从@tblname 中选择任何内容。我也尝试过使用动态 sql,但我不知道如何从中获得结果,或者这是否可能。
这是我在大学时正在做的一项作业,经过数小时的努力,我已经完成了这个任务。有什么办法可以做我想做的事吗?
【问题讨论】:
-
顺便说一句,不要在没有指定长度的情况下说
VARCHAR。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/… -
我早先在大小被声明为 1 的地方遇到了这个问题,但我在我现在无用的代码中修复了这个问题。不要让其他人落入那个陷阱!
标签: sql sql-server-2008 tsql stored-procedures dynamic-sql