Ошибка неверного имени столбца при использовании QUOTENAME - PullRequest
0 голосов
/ 27 июня 2019

У меня есть несколько таблиц, имеющих одинаковую структуру.Таблицы названы по году 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 ]

1 голос
/ 27 июня 2019

Я не знаю, почему вы используете оператор 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';
0 голосов
/ 27 июня 2019

Вам необходимо передать ваш параметр @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,'()') обернет значение в скобках). Для того, что вы хотите, вы должны параметрировать значение, а не вводить (в кавычках) значение.

0 голосов
/ 27 июня 2019

Это потому, что в настоящее время он переводится в:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...