使用QUOTENAME时,无效的列名错误

时间:2019-06-27 09:33:15

标签: sql sql-server tsql

我有几个具有相同结构的表。这些表以年份命名,即2001、2002,依此类推。我需要在每个表的列中搜索一个值,并获取每个表的计数。

我已经在下面创建了存储过程,但是我不断收到错误无效列'lol'。请参阅使用的存储过程:

Create PROCEDURE [dbo].[CountSP]

@TableName NVARCHAR(128),@SearchParam nvarchar(50),@SearchInput nvarchar(200)

AS 
BEGIN 
  SET NOCOUNT ON;
  DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N'SELECT COUNT('+QUOTENAME(@SearchParam)+') FROM ' + QUOTENAME(@TableName) +'WHERE'+QUOTENAME(@SearchParam)+'LIKE '+QUOTENAME(@SearchInput)+

          + N' SELECT * FROM '+QUOTENAME(@TableName)


 EXECUTE sp_executesql @Sql

END

EXEC    @return_value = [dbo].[CountSP]
        @TableName = N'1999',
        @SearchParam = N'USERDESC',
        @SearchInput = N'lol'

SELECT  'Return Value' = @return_value

3 个答案:

答案 0 :(得分:1)

我不知道您为什么不使用通配符而在此处使用LIKE运算符,也直接将SysName数据类型用作对象名称。

Create PROCEDURE [dbo].[CountSP]
(
  @TableName SysName,
  @SearchInput NVARCHAR(50),
  @SearchParam SysName
)
AS 
  SET NOCOUNT ON;

  DECLARE @SQL NVARCHAR(MAX) = N'SELECT COUNT(' +
                               QUOTENAME(@SearchParam) +
                               N') FROM ' +
                               QUOTENAME(@TableName) +
                               N' WHERE ' +
                               QUOTENAME(@SearchParam) +
                               N' = ' + --You can change it to LIKE if needed
                               QUOTENAME(@SearchInput, '''') +
                               N';';
  -- There is no benifits of using LIKE operator there
  EXEC sp_executesql @SQL;

然后您可以将其称为

EXEC [dbo].[CountSP] N'YourTableNameHere', N'SearchInput', N'ColumnName';

答案 1 :(得分:0)

这是因为它当前已翻译为:

SELECT COUNT([USERDESC]) FROM [1999] WHERE [USERDESC] LIKE [lol]

这意味着它将“ USERDESC”列与“ lol”列进行比较,但是据我了解,lol不是列而是值?这意味着您应该丢失该变量的QUOTENAME。 请参阅此处的文档:https://docs.microsoft.com/en-us/sql/t-sql/functions/quotename-transact-sql?view=sql-server-2017

答案 2 :(得分:0)

您需要将参数@SearchInput作为参数传递给sp_execute

CREATE PROCEDURE [dbo].[CountSP] @TableName sysname, --This is effectively the same datatype (as sysname is a synonym for nvarchar(128))
                                 @SearchParam sysname, --Have changed this one though
                                 @SearchInput nvarchar(200)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @Sql nvarchar(MAX);

    SET @Sql = N'SELECT COUNT(' + QUOTENAME(@SearchParam) + N') FROM ' + QUOTENAME(@TableName) + N'WHERE' + QUOTENAME(@SearchParam) + N' LIKE @SearchInput;' + NCHAR(13) + NCHAR(10) +
    N'SELECT * FROM ' + QUOTENAME(@TableName);


    EXECUTE sp_executesql @SQL, N'@SearchInput nvarchar(200)', @SearchInput;

END;

QUOTENAME默认情况下将在方括号([])中引用一个值。它确实接受第二个参数,该参数可用于定义其他字符(例如QUOTENAME(@Value,'()')将值括在括号中)。对于您想要的东西,您想参数化该值,而不是注入(带引号的)值。