我有几个具有相同结构的表。这些表以年份命名,即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
答案 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,'()')
将值括在括号中)。对于您想要的东西,您想参数化该值,而不是注入(带引号的)值。