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
答案 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的结果是一个相当笨拙的混乱...