如何使用动态查询获取表中的列数

时间:2019-02-01 06:09:34

标签: sql-server tsql

Alter proc sp_Get_all_the_details
(
@tablename varchar(20)
)
as
begin

Declare 
@sqlQueryNoofcolumns Nvarchar(1000)
set @sqlQueryNoofcolumns =  'select count(*) from  INFORMATION_SCHEMA.columns where TABLE_NAME = ' + @tablename
Execute sp_executesql @sqlQueryNoofcolumns
end

exec sp_Get_all_the_details emp

1 个答案:

答案 0 :(得分:2)

关于您自己的代码,请提前做一件事:

此行

set @sqlQueryNoofcolumns =  
'select count(*) from  INFORMATION_SCHEMA.columns where TABLE_NAME = ' + @tablename

将翻译为

select count(*) from  INFORMATION_SCHEMA.columns where TABLE_NAME = SomeTableName

但不带引号的部分SomeTableName将不被视为字符串文字。您必须将引号添加到动态创建中,例如

... where TABLE_NAME = ''' + @tablename + ''';' --you have to double the quotes *within* a string...

但实际答案在这里

这是一种典型情况,其中存储过程是执行此操作的错误工具。您可以用链锯切割面包,它可以工作,但不要抱怨结果……SP意味着要做。对于只读问题,VIEW或内嵌TVF更好。

此外,您不应使用sp_来命名自己的SP。这是保留的,可能会导致麻烦... Details here

最后但并非最不重要的一点:这不需要任何动态sql ...

尝试一下:

提示:我加入了架构,因为可以有两个名称相同的表,这将在结果中汇总...

CREATE FUNCTION dbo.GetAllTheDetails
(
     @SchemaName VARCHAR(250)
    ,@TableName VARCHAR(250)
)
RETURNS TABLE
AS
RETURN
SELECT c.* 
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_SCHEMA=ISNULL(@SchemaName,'dbo') AND c.TABLE_NAME=@TableName;
GO

-通过此类查询,您将获得所有列

SELECT * FROM dbo.GetAllTheDetails('dbo','SomeTableName');

-并且此查询将返回列数

SELECT COUNT(*) FROM dbo.GetAllTheDetails('dbo','SomeTableName');

iTVF和VIEW的最大优点:您可以在查询中的任何FROM子句,JOIN s中以任何普通表的形式使用它们-随心所欲。使用SP的结果是一个相当笨拙的混乱...