Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 计算以单词开头的SQL列名_Sql Server_Vb.net - Fatal编程技术网

Sql server 计算以单词开头的SQL列名

Sql server 计算以单词开头的SQL列名,sql-server,vb.net,Sql Server,Vb.net,我有一个SQL Server表,其中包含列块1、块2和块3 如果所有这些列中都已包含数据,则我的程序将以编程方式在表中创建另一列,并使用下一个块编号。在这种情况下,将创建的下一个标题将是块4 这已经适用于一个hack(如下代码所示),当我的表中有另一列的列数波动时,它将不起作用 con.Open() Cmd = New SqlCommand("Select * From [Official] WHERE CONVERT(nvarchar(50), ID) ='" + Ses

我有一个SQL Server表,其中包含列
块1
块2
块3

如果所有这些列中都已包含数据,则我的程序将以编程方式在表中创建另一列,并使用下一个块编号。在这种情况下,将创建的下一个标题将是
块4

这已经适用于一个hack(如下代码所示),当我的表中有另一列的列数波动时,它将不起作用

con.Open()           
Cmd = New SqlCommand("Select * From [Official] WHERE CONVERT(nvarchar(50), ID) ='" + Session("ID") + "'", con)
dr1 = Cmd.ExecuteReader
dr1.Read()

'If I add or removed columns in official table I need to add or subtract to number below!!!

Dim NumberOfBlocks As Integer = dr1.VisibleFieldCount - 15 'minus 15 because that is the number of items other than blocks within officials table
这是我的问题,所以我不必做上面不可靠的黑客:

如何计算我的表中有多少列名称以单词“Blocks”开头

我希望能够在Visual Basic中使用SQL语法或仅在SQL中执行此操作

谢谢你的帮助

如何计算我的表中有多少列名称以单词“Blocks”开头

要用于简单计数的SQL语法如下所示:

select count(*) from tablename foo where foo.columnname = 'Blocks'
select count(*) from tablename foo where foo.columnname like 'Blocks%'
或者对于这样的通配符:

select count(*) from tablename foo where foo.columnname = 'Blocks'
select count(*) from tablename foo where foo.columnname like 'Blocks%'
您可以将输出值存储为变量,并在程序的其余部分使用它


字段名/列名是OP后面的内容。不是名为“ColumnName”的字段

在这种情况下,您需要执行以下操作:

select column_name 
from information_schema.columns 
where table_name = 'foo' and column_name = 'Blocks'

使用通配符也是一样。

在一些帖子的帮助下,我能够更好地搜索答案,并得到以下解决方案

这是一个示例,说明了在使用select命令和数据读取器后,如何在visual basic中实现这一点

下面的代码是从每一列中获取列名,并检查它是否以单词“Blocks”开头,然后对它们进行计数,以便稍后在我的程序中使用。谢谢你的帮助

Dim CountBlocks As Integer = 0
For i = 0 To dr1.VisibleFieldCount - 1
    If dr1.GetName(i).StartsWith("Blocks") Then
    CountBlocks = CountBlocks + 1
    Else
    'Dont count
    End If
Next

在SQL中,可以使用以下命令

select column_name 
from information_schema.columns 
where table_name = 'llf_promotion' and column_name like '%block%'
在我的示例中,我正在使用sql server通配符%搜索表llf_promotion,以获取包含单词block的列列表。如果我想找到任何以block开头的列,我会使用“column_name like'block%”,其中我只在末尾使用通配符

使用下面的内容,您可以只获得计数,而不是如上所示的列列表

select count(*) 
    from information_schema.columns 
    where table_name = 'llf_promotion' and column_name like '%block%'

我使用的是Microsoft SQL。您需要编辑问题并添加标签
SQL server
列“块1”、“块2”和“块3”
听起来您的数据库缺少1:m(或者可能是m:m)关系。使表可以有许多与之关联的块,并且您不必计算列。您的模式听起来不太好,所以您将一次又一次地遇到类似的问题。同样,我相信您希望获得
dr1.GetSchemaTable()
。它返回一个
datatable
类型的对象,您可以在代码中找到
SqlDataReader
对象
dr1
的列名。我会写这篇文章作为一个答案,但我已经有8年没有写过vb.net了,所以我肯定会把代码的实际实现搞砸。字段名/列名就是OP想要的。不是一个名为“ColumnName”的字段,那么我如何在下一个select Statemens中使用此计数?例如,如果我有3个以块开头的列,我的select语句稍后将只选择块1、块2和块3,我不确定您要做什么,但在我看来,您最好将块数据保存在单独的表中,而不是每次添加新的列。