Sql server sql如何理解或转换sql server中表的nvarchar名称

Sql server sql如何理解或转换sql server中表的nvarchar名称,sql-server,function,tsql,Sql Server,Function,Tsql,我没有在SQL SERVER中运行代码 ALTER FUNCTION return_table (@table nvarchar(250)) RETURNS TABLE AS RETURN ( SELECT * FROM @table ) 无使用程序。感谢帮助函数需要明确定义返回值类型,例如返回的列。由于以下原因,您提供的SQL语句将无法以这种方式工作: ALTER FUNCTION return_table (@table nvarchar(250)) -- You have

我没有在SQL SERVER中运行代码

ALTER FUNCTION return_table (@table nvarchar(250))
RETURNS  TABLE 
AS
RETURN
(
     SELECT * FROM @table
)

无使用程序。感谢帮助

函数需要明确定义返回值类型,例如返回的列。由于以下原因,您提供的SQL语句将无法以这种方式工作:

ALTER FUNCTION return_table (@table nvarchar(250)) -- You have declared a parameter of type table, this is not the right way of doing this
RETURNS  TABLE  -- you haven't defined the structure of the table being returned, this needs explicitly defining
AS
RETURN
(
     SELECT * FROM @table -- using SELECT * is bad practice as the structure of the table may change and then conflict with the structure of the table being returned
)
问题的第一部分是声明类型为
TABLE
的参数;有很好的例子来说明如何做到这一点。快速总结:在将类型作为参数传递给函数之前,需要将表声明为类型:

CREATE TYPE MyTableParameterDefinition AS TABLE (
   [ColumnName] NVARCHAR(250) NULL
)
CREATE FUNCTION myFunctionName (
  @TableVariable MyTableParameterDefinition READONLY
)...--INSERT CODE HERE--
然后可以将此类型作为参数传递给函数:

CREATE TYPE MyTableParameterDefinition AS TABLE (
   [ColumnName] NVARCHAR(250) NULL
)
CREATE FUNCTION myFunctionName (
  @TableVariable MyTableParameterDefinition READONLY
)...--INSERT CODE HERE--
我不确定您是否可以对返回类型使用类似的方法,鉴于函数定义的契约的含义,我建议您不要这样做。更好的做法是定义要返回的表的结构,并从表中显式选择列:

ALTER FUNCTION return_table (
    @table MyTableParameterDefinition
) 
RETURNS  TABLE 
(
    -- Explicitly define columns returned by the function
   [ColumnName] NVARCHAR(250) NULL
)
AS
RETURN
(
     SELECT 
        [ColumnName]
     FROM 
        @table 
)

从美学和(可能)性能两方面考虑,制作这部作品的唯一方法是真正可怕的。它还假设所有可能作为参数传递的表都具有相同的结构:

ALTER FUNCTION return_table (@table sysname)
RETURNS  TABLE 
AS
RETURN
(
     SELECT * FROM TableA where @table = 'TableA'
     UNION ALL
     SELECT * FROM TableB where @table = 'TableB'
     UNION ALL
     SELECT * FROM TableC where @table = 'TableC'
     /* add more UNIONs and SELECTs for each table that you want to use */
)

有什么办法可以帮助你?但是使用函数。谢谢你,你不能。参数化表名的唯一(半正常)方法是使用动态SQL,这在函数hank talegna中是不允许的。我理解您的理想,但我希望我的函数可以使用数据库中的所有表,如果我的数据库有100多个表。我认为这个函数会有很多问题,例如:编辑列或数据类型。我希望有一个函数可以用于我的所有表,并且可以在sql中的其他查询中使用它。按照您的描述执行您想要执行的操作是不可能的,除非所有表都具有相同的格式。对于您想要做的这类事情,更可能的是使用动态SQL,但正如@Damien_不相信者所说的那样,无法在函数中完成。您还需要记住,函数的返回格式必须明确定义,不能返回泛型表,因为它不是函数,
存储过程
将是以这种方式返回表中所有项的唯一选项,即使这样,这也是一种糟糕的编码做法。噢。谢谢塔莱格纳。我会用另一种方法来解决这个问题。但我喜欢一个函数或过程可以用于多个表:(并且可以更容易地检查错误。这次。如果使用过程,我不能检查查询的错误。优化SQL语句是最好的。对不起,我的英语技能很差:D可能是你不明白我的难过:D但非常感谢!