子查询返回的值超过1。当子查询用作表达式时

时间:2017-04-06 07:36:23

标签: sql-server sql-server-2008-r2

我运行以下查询:

从表中搜索特定模式

但是得到错误:

“子查询返回的值超过1。当子查询跟随=,!=,<,< =,>,> =或子查询用作表达式”

 DECLARE @SearchStr nvarchar(100)
 SET @SearchStr = '' 

--drop table #Results

CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
  SET NOCOUNT ON
  DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
 SET  @TableName = ''
  SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

 WHILE @TableName IS NOT NULL
 BEGIN

SET @ColumnName = ''
SET @TableName = 'RAP1'

WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
    SET @ColumnName =
    (

        SELECT COLUMN_NAME
        FROM     INFORMATION_SCHEMA.COLUMNS
        WHERE         
         TABLE_NAME    = PARSENAME(@TableName, 1)
            AND    DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')

    )

    IF @ColumnName IS NOT NULL
    BEGIN
        INSERT INTO #Results
        EXEC
        (
            'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' +
            ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
        )
    END
END   
 END
 SELECT ColumnName, ColumnValue FROM #Results

 DROP TABLE #Results

有什么问题?怎么得到结果?请帮忙。

1 个答案:

答案 0 :(得分:0)

这很可能是因为表RAP1有超过1列,并且您正试图将该表的每一列的值(名称)保存在一个变量中(在{中{1}})。

如果以下查询返回多于1行,那么这就是您的问题:

SET @ColumnName

我会将您的脚本更改为以下内容:

DECLARE @TableName nvarchar(256)
SET @TableName = 'RAP1'

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = PARSENAME(@TableName, 1)
    AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')