【问题标题】:Table name as parameter for Microsoft SQL Server procedure表名作为 Microsoft SQL Server 过程的参数
【发布时间】:2022-08-23 04:35:31
【问题描述】:

我正在尝试使用 SQL Server 过程创建两个具有不同名称的表,具体取决于变量是 (1) 还是否 (0)。我所看到的一切都是指临时表。我想将表永久存储在数据库中。

CREATE PROCEDURE DUALTYPE 
    @TableName nvarchar(18), @YesNo int 
AS 
BEGIN 
    SELECT * 
    INTO dbo.[@TableName] 
    FROM 
        (SELECT * FROM mytable
         WHERE dual = @YesNo) dualtab
END

EXEC DUALTYPE @TableName = \'dualtable\' @YesNo = 0

该过程执行,但它认为我的表名是@TableName。我如何告诉它使用 \'dualtable\' 代替?

  • 根据变量是 (1) 还是否 (0) 创建两个具有不同名称的表- 您似乎根本没有这样做,您正在尝试显式传递表名并使用@YesNo 过滤正在填充的行。
  • 您至少需要一个 CREATE TABLE 语句。你确定这是你想做的吗?比如你想解决什么问题?这个要求听起来有点可疑。
  • 好的。我正在使用 Microsoft SQL;我认为 CREATE TABLE 仅适用于 Oracle。
  • 您不能将参数用作对象名称。如果要传递对象名称,则必须将 sql 语句构造为要使用 EXECUTE sp_executesql 执行的字符串
  • 我以为 CREATE TABLE 只适用于 Oracle你是怎么得出这个结论的? create table 是几乎每个 DBMS 都使用的 ISO SQL - 也许 Oracle 参考是双重的也起源于

标签: sql-server stored-procedures


【解决方案1】:

下面的代码使用 T-SQL,允许使用相同的查询输入不同的变量。然后将输出存储在数据库的不同表中。它有利于根据不同的可变标准制作独特的样本。

declare @TableName sysname;
declare @YesNo int;
declare @parms nvarchar(max);
declare @query nvarchar(max);

set @TableName = 'Yes'
set @YesNo = 1
set @query = '
    Select * into [mydb].dbo.' + QUOTENAME(@TableName) + '
    from 
    mytab
    where dual = @lvl'
set @parms = N'@lvl int'

EXEC sp_executesql @query, @parms, @lvl = @YesNo

【讨论】:

  • 请记住,Stack Overflow 不仅旨在解决眼前的问题,还可以帮助未来的读者找到类似问题的解决方案,这需要了解底层代码。这对于我们社区的初学者和不熟悉语法的成员来说尤其重要。鉴于,你能edit你的答案包括你在做什么的解释吗为什么你认为这是最好的方法?
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2023-03-20
  • 2011-07-04
相关资源
最近更新 更多