Я знаю, что пользователь спросил об этом для Linux, но у меня была эта проблема в Windows (10 64 бит), и я нашел мало информации, поэтому я решил это:
Если LIBAV не помогает, попробуйте FFMPEG , копируя содержимое папки «bin», где находится «youtube-dl.exe». Это не помогло мне, но другие сказали, что это так, поэтому стоит попробовать.
Надеюсь, это поможет кому-то, имеющему проблему в Windows.
Вот sql или более поздняя версия 2005 года: Замените ADDR_Address своим именем таблицы.
declare @col varchar(255), @cmd varchar(max)
DECLARE getinfo cursor for
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID
WHERE t.Name = 'ADDR_Address'
OPEN getinfo
FETCH NEXT FROM getinfo into @col
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @cmd = 'IF NOT EXISTS (SELECT top 1 * FROM ADDR_Address WHERE [' + @col + '] IS NOT NULL) BEGIN print ''' + @col + ''' end'
EXEC(@cmd)
FETCH NEXT FROM getinfo into @col
END
CLOSE getinfo
DEALLOCATE getinfo
Здесь я создал сценарий для любого вида таблицы SQL. скопируйте эту хранимую процедуру и создайте это на Вашей Среде и выполните эту хранимую процедуру с Вашей Таблицей.
exec [dbo].[SP_RemoveNullValues] 'Your_Table_Name'
хранимая процедура
GO
/****** Object: StoredProcedure [dbo].[SP_RemoveNullValues] Script Date: 09/09/2019 11:26:53 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- akila liyanaarachchi
Create procedure [dbo].[SP_RemoveNullValues](@PTableName Varchar(50) ) as
begin
DECLARE Cussor CURSOR FOR
SELECT COLUMN_NAME,TABLE_NAME,DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @PTableName
OPEN Cussor;
Declare @ColumnName Varchar(50)
Declare @TableName Varchar(50)
Declare @DataType Varchar(50)
Declare @Flage int
FETCH NEXT FROM Cussor INTO @ColumnName,@TableName,@DataType
WHILE @@FETCH_STATUS = 0
BEGIN
set @Flage=0
If(@DataType in('bigint','numeric','bit','smallint','decimal','smallmoney','int','tinyint','money','float','real'))
begin
set @Flage=1
end
If(@DataType in('date','atetimeoffset','datetime2','smalldatetime','datetime','time'))
begin
set @Flage=2
end
If(@DataType in('char','varchar','text','nchar','nvarchar','ntext'))
begin
set @Flage=3
end
If(@DataType in('binary','varbinary'))
begin
set @Flage=4
end
DECLARE @SQL VARCHAR(MAX)
if (@Flage in(1,4))
begin
SET @SQL =' update ['+@TableName+'] set ['+@ColumnName+']=0 where ['+@ColumnName+'] is null'
end
if (@Flage =3)
begin
SET @SQL =' update ['+@TableName+'] set ['+@ColumnName+'] = '''' where ['+@ColumnName+'] is null '
end
if (@Flage =2)
begin
SET @SQL =' update ['+@TableName+'] set ['+@ColumnName+'] ='+'''1901-01-01 00:00:00.000'''+' where ['+@ColumnName+'] is null '
end
EXEC(@SQL)
FETCH NEXT FROM Cussor INTO @ColumnName,@TableName,@DataType
END
CLOSE Cussor
DEALLOCATE Cussor
END
Или Вы хотели просто видеть, имеет ли столбец только Нулевые значения (и, таким образом, вероятно, не использовано)?
Дальнейшее разъяснение вопроса могло бы помочь.
РЕДАКТИРОВАНИЕ: хорошо.. вот некоторый действительно грубый код для получения Вас движение...
SET NOCOUNT ON
DECLARE @TableName Varchar(100)
SET @TableName='YourTableName'
CREATE TABLE #NullColumns (ColumnName Varchar(100), OnlyNulls BIT)
INSERT INTO #NullColumns (ColumnName, OnlyNulls) SELECT c.name, 0 FROM syscolumns c INNER JOIN sysobjects o ON c.id = o.id AND o.name = @TableName AND o.xtype = 'U'
DECLARE @DynamicSQL AS Nvarchar(2000)
DECLARE @ColumnName Varchar(100)
DECLARE @RC INT
SELECT TOP 1 @ColumnName = ColumnName FROM #NullColumns WHERE OnlyNulls=0
WHILE @@ROWCOUNT > 0
BEGIN
SET @RC=0
SET @DynamicSQL = 'SELECT TOP 1 1 As HasNonNulls FROM ' + @TableName + ' (nolock) WHERE ''' + @ColumnName + ''' IS NOT NULL'
EXEC sp_executesql @DynamicSQL
set @RC=@@rowcount
IF @RC=1
BEGIN
SET @DynamicSQL = 'UPDATE #NullColumns SET OnlyNulls=1 WHERE ColumnName=''' + @ColumnName + ''''
EXEC sp_executesql @DynamicSQL
END
ELSE
BEGIN
SET @DynamicSQL = 'DELETE FROM #NullColumns WHERE ColumnName=''' + @ColumnName+ ''''
EXEC sp_executesql @DynamicSQL
END
SELECT TOP 1 @ColumnName = ColumnName FROM #NullColumns WHERE OnlyNulls=0
END
SELECT * FROM #NullColumns
DROP TABLE #NullColumns
SET NOCOUNT OFF
Да, существуют более легкие пути, но у меня есть встреча для движения в прямо сейчас.Удачи!
Можно сделать:
select
count(<columnName>)
from
<tableName>
, Если количество возвращается 0, который означает, что все строки в том столбце весь ПУСТОЙ УКАЗАТЕЛЬ (или нет никаких строк вообще в таблице)
может быть изменен на
select
case(count(<columnName>)) when 0 then 'Nulls Only' else 'Some Values' end
from
<tableName>
, Если Вы хотите автоматизировать его, можно использовать системные таблицы для итерации имен столбцов в таблице, Вы интересуетесь
Это должно дать Вам список всех столбцов в таблице "Person", которая имеет только Нулевые значения. Вы получите результаты как несколько наборов результатов, которые или пусты, или содержит название отдельного столбца. Необходимо заменить "Человека" в двух местах для использования его с другой таблицей.
DECLARE crs CURSOR LOCAL FAST_FORWARD FOR SELECT name FROM syscolumns WHERE id=OBJECT_ID('Person')
OPEN crs
DECLARE @name sysname
FETCH NEXT FROM crs INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('SELECT ''' + @name + ''' WHERE NOT EXISTS (SELECT * FROM Person WHERE ' + @name + ' IS NOT NULL)')
FETCH NEXT FROM crs INTO @name
END
CLOSE crs
DEALLOCATE crs
Я также рекомендовал бы искать поля, которые у всех есть то же значение, не просто ПУСТОЙ УКАЗАТЕЛЬ.
таким образом, для каждого столбца в каждой таблице делают запрос:
SELECT COUNT(DISTINCT field) FROM tableName
и концентрат на тех, которые возвращаются 1 в результате.
Необходимо будет циклично выполниться по набору столбцов и проверить каждого. Необходимо быть в состоянии получить список всех столбцов с командой таблицы DESCRIBE.
Псевдокод:
foreach $column ($cols) {
query("SELECT count(*) FROM table WHERE $column IS NOT NULL")
if($result is zero) {
# $column contains only null values"
push @onlyNullColumns, $column;
} else {
# $column contains non-null values
}
}
return @onlyNullColumns;
я знаю, что это кажется немного парадоксальным, но SQL не обеспечивает собственный метод выбора столбцов, только строки.
Если необходимо перечислить все строки, где все значения столбцов NULL
, то я использовал бы эти COLLATE
функция. Это берет список значений и возвращает первое ненулевое значение. Если Вы добавляете все имена столбцов к списку, то используйте IS NULL
, необходимо добраться, все строки, содержащие только, аннулирует.
SELECT * FROM MyTable WHERE COLLATE(Col1, Col2, Col3, Col4......) IS NULL
у Вас не должно действительно быть таблиц с ВЕСЬ columns
пустой указатель, поскольку это означает, что Вы не имеете primary key
(не позволенный быть null
). Не наличие первичного ключа является чем-то, чтобы избежаться; это повреждает первую нормальную форму.
Вы, возможно, должны были бы разъясниться немного. Что Вы действительно пытаетесь выполнить? Если Вы действительно хотите узнать имена столбцов, которые только содержат нулевые значения, то необходимо будет циклично выполниться через scheama и сделать динамический запрос на основе этого.
я не знаю, какой DBMS Вы используете, таким образом, я помещу некоторый псевдокод здесь.
for each col
begin
@cmd = 'if not exists (select * from tablename where ' + col + ' is not null begin print ' + col + ' end'
exec(@cmd)
end