当我强制转换或转换为字符串时,SQL认为我的表名是完整表的问题

当我强制转换或转换为字符串时,SQL认为我的表名是完整表的问题,sql,sql-server,tsql,Sql,Sql Server,Tsql,所以我遇到了一个字符串转换的问题。我什么都试过了。我的目标是将循环中的值放入表中。但是,我可以获取字段值,但无法获取表名值,因为sql认为我调用的是表而不是字符串。我已经试过了。以下是代码示例: DECLARE @C varchar(65) DECLARE @FieldName varchar(50) SET @FieldName = 'ProjectID' SELECT @C = MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABL

所以我遇到了一个字符串转换的问题。我什么都试过了。我的目标是将循环中的值放入表中。但是,我可以获取字段值,但无法获取表名值,因为sql认为我调用的是表而不是字符串。我已经试过了。以下是代码示例:

DECLARE @C varchar(65)
DECLARE @FieldName varchar(50)
SET @FieldName = 'ProjectID'
SELECT @C = MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'Base Table'

CREATE TABLE #temp_t (
    [field] varchar(100),
    [tblname] varchar(100)
    )

WHILE @C is not null
    BEGIN
        DECLARE @qbExists int
        DECLARE @tblname varchar(100)
        SET @tblname = CONVERT(varchar(100), @C)
        SELECT @qbExists = COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @C AND COLUMN_NAME = @FieldName
        IF @qbExists = 1 AND 
           @C <> 'TimeExpenseUnionQuery' AND 
           @C <> 'TimeExpense' AND
           @C <> 'BC_BA' AND
           @C <> 'BC_BE' AND
           @C <> 'BC_EL' AND
           @C <> 'BC_TE'
          BEGIN
            EXEC('
                  SELECT ' + @FieldName + ', ' + @C + ' FROM ' + @tblName +'
                 ')
          END

        SELECT @C = MIN( TABLE_NAME ) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME > @C
END

SELECT * FROM #temp_t 

DROP TABLE #temp_t
问题子项位于从“++@tblName”中选择“++@FieldName+”、“++@C++”的范围内。
现在,如果我不使用@C,它可以正常工作。如果我试图转换或强制转换@C,我会得到一个无效的列名?给出了什么?

您需要引用它使其成为常数,因为动态SQL需要加倍

EXEC('
              SELECT ' + @FieldName + ', ''' + @C + ''' FROM ' + @tblName +'
             ')

使用动态SQL是不是一个好主意是另一回事…

您需要引用它使其成为常量,因为动态SQL需要加倍使用

EXEC('
              SELECT ' + @FieldName + ', ''' + @C + ''' FROM ' + @tblName +'
             ')

使用动态SQL是不是一个好主意是另一回事…

看起来您正在尝试执行:

SELECT <fieldname>, <tablename> FROM <same tablename>

您的意思是将表名用引号括起来吗?

看起来您正在尝试执行:

SELECT <fieldname>, <tablename> FROM <same tablename>

您的意思是将表名放在引号中吗?

在开发动态SQL解决方案时,有一件事总是一个好主意,就像您在这里所做的那样,那就是首先打印出语句,并确保它看起来像您想要的那样。我认为其他回答者都有其要点:似乎您正试图打印出表名的字符串文字。如果是这样的话,您需要在执行的查询中用引号将其括起来,这意味着您在构建查询时需要做一些工作。

在开发动态SQL解决方案时,像您在这里所做的一样,有一件事始终是一个好主意,那就是首先打印出语句,并确保它看起来像您希望的那样。我认为其他回答者都有其要点:似乎您正试图打印出表名的字符串文字。如果是这种情况,则需要在执行的查询中用引号将其括起来,这意味着在构建查询时需要做一些工作。

我爱你,哇,我怎么会错过这一点。非常感谢你,伙计!我爱你,哇,我怎么会错过呢。非常感谢你,伙计!