2015-09-30 33 views
0

有此查询,我一直用了个遍:如何使用表作为变量在存储过程

SELECT column_name, count(column_name) FROM table_name GROUP by column_name ORDER BY COUNT(column_name) DESC 

我用它来检查哪些不同的值有一列中,如何他们经常发生。 因为我用这个查询经常和它的重复相同的4倍:列名,我当时想:为什么不把一个存储过程:

CREATE PROCEDURE countcv @table_name VARCHAR(50),@column_name VARCHAR(50) 
AS 
BEGIN 
    SELECT @column_name,COUNT(@column_name) FROM @table_name GROUP BY @column_name ORDER BY COUNT(@column_name) 
END 

在这里被我卡住,我不能设法得到一个变量表名:如果你想要做这样的事情

必须声明表变量 “@table_name”

回答

1

,你必须使用动态SQL:

CREATE PROCEDURE countcv @table_name sysname, @column_name sysname 
AS 
BEGIN 
    Declare @sql nvarchar(max) 
    Set @sql = 'SELECT ' + QUOTENAME(@column_name)+', COUNT(' + QUOTENAME(@column_name)+') 
     FROM ' + QUOTENAME(@table_name)+' 
     GROUP BY ' + QUOTENAME(@column_name)+' ORDER BY COUNT(' + QUOTENAME(@column_name)+')' 
    EXEC sp_executesql @sql 
END 
  • 为(对象名称buitin数据类型,别名为nvarchar(128)),用于列和表名数据类型
  • 使用QUOTENAME添加定界符到列和表名称使用数据类型为sysname
1

我相信@Julien Vavasseur和@Dark Knight已经提出了你的问题。 但是,我想在此补充一点,Sql Server 2008引入了Table-Valued Parameter,通过使用它我们可以将表类型变量传递给存储过程。例如

假设您的名字TBLTEST与下面列

ID INT, 
Name VARCHAR(50) 

第1步有一个表:声明一个新表用户定义类型

CREATE TYPE tblTestType AS TABLE 
(
    ID INT, 
    Name VARCHAR(50) 
) 

第2步:创建一个存有tblTestType为p的存储过程arameter

CREATE PROCEDURE countcv 
(
    @tblName tblTestType readonly 
) 

AS 
INSERT INTO tblTest (ID, Name) 
SELECT ID, Name 
FROM 
@tblName; 

然后可以使用数据表(如果使用的是C#),并通过该数据表作为参数来存储过程。(能找到在我提供的链接的示例)。